package cn.outofmemory.codes.Date;
import java.util.Calendar;
import java.util.Date;
public class CalendarDemo {
public static void main(String[] args) {
Calendar calendar=Calendar.getInstance();
calendar.setTime(new Date());
System.out.println("现在时间是:"+new Date());
String year=String.valueOf(calendar.get(Calendar.YEAR));
String month=String.valueOf(calendar.get(Calendar.MONTH)+1);
String day=String.valueOf(calendar.get(Calendar.DAY_OF_MONTH));
String week=String.valueOf(calendar.get(Calendar.DAY_OF_WEEK)-1);
System.out.println("现在时间是:"+year+"年"+month+"月"+day+"日,星期"+week);
long year2009=calendar.getTimeInMillis();
calendar.set(1989,9,26);//这里与真实的月份之间相差1
long year1989=calendar.getTimeInMillis();
long days=(year2009-year1989)/(1000*60*60*24);
System.out.println("今天和1989年10月26日相隔"+days+"天,"+"也就是说我在这个美丽的星球上已经幸福的生活了"+days+"天。");
}
}
로그인 후 복사
Calendar 클래스의 정적 메소드 getInstance()는 달력 객체를 초기화할 수 있습니다.
Calendar now = Calendar.getInstance();
다음 세 가지 메소드를 사용하여 달력을 임의의 시간으로:
set(int year ,int month,int date)
set(int year ,int month,int date,int hour,int minute)
set(int year ,int month,int date,int hour,int minute,int second)
로그인 후 복사
연도, 월, 시간 및 기타 정보를 얻으려면 다음을 사용할 수 있습니다.
Now.get(Calendar.Month) 여기에서 그런데 0은 1월을 의미하고 1은 2월을 의미합니다.
get(Calendar.DAY_OF_MONTH)은 날짜를 가져옵니다
get(Calendar.DAY_OF_WEEK)는 요일을 가져옵니다
get(Calendar.DAY_OF_YEAR)는 날짜를 가져옵니다. day of the year
getTimeMillis()는 현재 시간의 밀리초 표현을 얻습니다.
다음은 Calendar 클래스 메소드에 대한 소개입니다.
abstract void add(int field, int amount) 달력의 규칙에 따라 주어진 달력 필드를 추가하거나 지정된 시간을 뺍니다.
boolean after(Object when) 이 Calendar가 나타내는 시간이 지정된 Object가 나타내는 시간보다 이후인지 여부를 판단하여 판단 결과를 반환합니다.
boolean before(Object when) 이 Calendar가 나타내는 시간이 지정된 Object가 나타내는 시간보다 이전인지 여부를 판단하여 판단 결과를 반환합니다.
voidclear() 이 달력의 모든 달력 필드 값과 시간 값(시대부터 현재까지의 밀리초 오프셋)을 정의되지 않음으로 설정합니다.
voidclear(int field) 이 달력의 지정된 달력 필드 값과 시간 값(시대부터 현재까지의 밀리초 오프셋)을 정의되지 않음으로 설정합니다.
객체 clone()은 이 객체의 복사본을 생성하고 반환합니다.
int CompareTo(Calendar anotherCalendar) 두 개의 Calendar 객체가 나타내는 시간 값(시대부터 현재까지의 밀리초 오프셋)을 비교합니다.
protected voidcomplete()는 달력 필드에서 설정되지 않은 모든 필드를 채웁니다.
protected abstract void ComputeFields()는 현재 밀리초 시간 값 시간을 fields[]의 달력 필드 값으로 변환합니다.
protected abstract void ComputeTime()은 fields[]의 현재 달력 필드 값을 밀리초 시간 값 시간으로 변환합니다.
boolean equals(Object obj) 이 달력을 지정된 개체와 비교합니다.
int get(int field)는 주어진 달력 필드의 값을 반환합니다.
int getActualMaximum(int field) 이 달력의 시간 값이 주어지면 지정된 달력 필드가 가질 수 있는 최대값을 반환합니다.
int getActualMinimum(int field) 이 달력의 시간 값이 주어지면 지정된 달력 필드가 가질 수 있는 최소값을 반환합니다.
static Locale[] getAvailableLocales()는 모든 로캘의 배열을 반환하며 이 클래스의 getInstance 메서드는 이에 대한 현지화된 인스턴스를 반환할 수 있습니다.
문자열 getDisplayName(int field, int style, Locale locale) 지정된 스타일 및 로케일에서 달력 필드 값의 문자열 표현을 반환합니다.
Map
getDisplayNames(int field, int style, Locale locale) 지정된 스타일 및 로케일에 따른 달력 필드의 모든 이름과 해당 필드 값이 포함된 맵을 반환합니다.
int getFirstDayOfWeek() 주의 첫 번째 요일을 가져옵니다. 예를 들어 미국에서는 이 날이 SUNDAY이고 프랑스에서는 이 날이 월요일입니다.
abstract int getGreatestMinimum(int field) 이 Calendar 인스턴스의 지정된 달력 필드의 가장 높은 최소값을 반환합니다.
static Calendar getInstance() 기본 시간대와 로케일을 사용하여 달력을 가져옵니다.
static Calendar getInstance(Locale aLocale) 기본 시간대와 지정된 로케일을 사용하여 달력을 가져옵니다.
static Calendar getInstance(TimeZone zone) 지정된 시간대와 기본 로케일을 사용하여 달력을 가져옵니다.
static Calendar getInstance(TimeZone zone, Locale aLocale) 지정된 시간대와 로케일을 사용하여 달력을 가져옵니다.
abstract int getLeastMaximum(int field) 이 Calendar 인스턴스의 지정된 달력 필드에 대한 가장 낮은 최대값을 반환합니다.
abstract int getMaximum(int field) 이 Calendar 인스턴스의 지정된 달력 필드의 최대값을 반환합니다.
int getMinimalDaysInFirstWeek() 해당 연도의 첫 번째 주에 필요한 최소 일 수를 가져옵니다. 예를 들어 첫 번째 주가 해당 연도의 첫 번째 달의 첫 번째 날을 포함하도록 정의된 경우 이 메서드는 1을 반환합니다.
abstract int getMinimum(int field) 이 Calendar 인스턴스의 지정된 달력 필드의 최소값을 반환합니다.
Date getTime()은 이 달력 시간 값(시대부터 현재까지의 밀리초 오프셋)을 나타내는 Date 객체를 반환합니다.
long getTimeInMillis()는 이 달력의 시간 값을 밀리초 단위로 반환합니다.
TimeZone getTimeZone()은 시간대를 가져옵니다.
int hashCode()는 이 달력의 해시 코드를 반환합니다.
protected int InternalGet(int field)는 주어진 달력 필드의 값을 반환합니다.
boolean isLenient()判断日期/时间的解释是否为宽松的。
boolean isSet(int field) 确定给定日历字段是否已经设置了一个值,其中包括因为调用 get 方法触发内部字段计算而导致已经设置该值的情况。
abstract void roll(int field, boolean up) 在给定的时间字段上添加或减去(上/下)单个时间单元,不更改更大的字段。
void roll(int field, int amount) 向指定日历字段添加指定(有符号的)时间量,不更改更大的字段。
void set(int field, int value) 将给定的日历字段设置为给定值。
void set(int year, int month, int date) 设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值。
void set(int year, int month, int date, int hourOfDay, int minute) 设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值。
void set(int year, int month, int date, int hourOfDay, int minute, int second) 设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值。
void setFirstDayOfWeek(int value) 设置一星期的第一天是哪一天;例如,在美国,这一天是 SUNDAY,而在法国,这一天是 MONDAY。
void setLenient(boolean lenient) 指定日期/时间解释是否是宽松的。
void setMinimalDaysInFirstWeek(int value) 设置一年中第一个星期所需的最少天数,例如,如果定义第一个星期包含一年第一个月的第一天,则使用值 1 调用此方法。
void setTime(Date date) 使用给定的 Date 设置此 Calendar 的时间。
void setTimeInMillis(long millis) 用给定的 long 值设置此 Calendar 的当前时间值。
void setTimeZone(TimeZone value) 使用给定的时区值来设置时区。
String toString() 返回此日历的字符串表示形式
Calendar的常用方法示例
1、计算某一月份的最大天数
Calendar time=Calendar.getInstance();
time.clear();
time.set(Calendar.YEAR,year);
time.set(Calendar.MONTH,i-1);//注意,Calendar对象默认一月为0
int day=time.getActualMaximum(Calendar.DAY_OF_MONTH);//本月份的天数
로그인 후 복사
注:在使用set方法之前,必须先clear一下,否则很多信息会继承自系统当前时间
2、Calendar和Date的转化
(1) Calendar转化为Date
Calendar cal=Calendar.getInstance();
Date date=cal.getTime();
로그인 후 복사
(2) Date转化为Calendar
Date date=new Date();
Calendar cal=Calendar.getInstance();
cal.setTime(date);
로그인 후 복사
3、格式化输出日期时间
Date date=new Date();
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
System.out.println(df.format(date));
로그인 후 복사
4、计算一年中的第几星期
(1)计算某一天是一年中的第几星期
Calendar cal=Calendar.getInstance();
cal.set(Calendar.YEAR, 2006);
cal.set(Calendar.MONTH, 8);
cal.set(Calendar.DAY_OF_MONTH, 3);
int weekno=cal.get(Calendar.WEEK_OF_YEAR);
로그인 후 복사
(2)计算一年中的第几星期是几号
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
Calendar cal=Calendar.getInstance();
cal.set(Calendar.YEAR, 2006);
cal.set(Calendar.WEEK_OF_YEAR, 1);
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println(df.format(cal.getTime()));
로그인 후 복사
输出:
2006-01-02
5、add()和roll()的用法
(1) add()方法
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
Calendar cal=Calendar.getInstance();
cal.set(Calendar.YEAR, 2006);
cal.set(Calendar.MONTH, 8);
cal.set(Calendar.DAY_OF_MONTH, 3);
cal.add(Calendar.DATE, -4);
Date date=cal.getTime();
System.out.println(df.format(date));
cal.add(Calendar.DATE, 4);
date=cal.getTime();
System.out.println(df.format(date));
로그인 후 복사
输出:
2006-08-30
2006-09-03
(2)roll方法
cal.set(Calendar.YEAR, 2006);
cal.set(Calendar.MONTH, 8);
cal.set(Calendar.DAY_OF_MONTH, 3);
cal.roll(Calendar.DATE, -4);
date=cal.getTime();
System.out.println(df.format(date));
cal.roll(Calendar.DATE, 4);
date=cal.getTime();
System.out.println(df.format(date));
로그인 후 복사
输出:
2006-09-29
2006-09-03
可见,roll()方法在本月内循环,一般使用add()方法;
6、计算两个任意时间中间的间隔天数
(1)传进Calendar对象
/
**计算两个时间之间相隔天数
* @param startday 开始时间
* @param endday 结束时间
* @return
*/
public int getIntervalDays(Calendar startday,Calendar endday){
//确保startday在endday之前
if(startday.after(endday)){
Calendar cal=startday;
startday=endday;
endday=cal;
}
//分别得到两个时间的毫秒数
long sl=startday.getTimeInMillis();
long el=endday.getTimeInMillis();
long ei=el-sl;
//根据毫秒数计算间隔天数
return (int)(ei/(1000*60*60*24));
}
로그인 후 복사
(2)传进Date对象
/**计算两个时间之间相隔天数
* @param startday 开始时间
* @param endday 结束时间
* @return
*/
public int getIntervalDays(Date startday,Date endday){
//确保startday在endday之前
if(startday.after(endday)){
Date cal=startday;
startday=endday;
endday=cal;
}
//分别得到两个时间的毫秒数
long sl=startday.getTime();
long el=endday.getTime();
long ei=el-sl;
//根据毫秒数计算间隔天数
return (int)(ei/(1000*60*60*24));
}
로그인 후 복사
同理,可以用相同的方法计算出任意两个时间相隔的小时数,分钟数,秒钟数等
注:以上方法是完全按时间计算,有时并不能令人满意,如:
startday="2006-10-11 20:00:00" endday="2006-10-12 8:00:00"
计算结果为0,但是我们也许相让计算结果变为1,此时可以用如下方法实现:
在传参之前,先设定endday的时间,如:
endday.set(Calendar.HOUR_OF_DAY, 23);
endday.set(Calendar.MINUTE, 59);
endday.set(Calendar.SECOND, 59);
endday.set(Calendar.MILLISECOND, 59);
로그인 후 복사
这样再传进去startday,endday,则结果就如我们所愿了。不过,如果嫌以上方法麻烦,可以参考以下方法:
(3)改进精确计算相隔天数的方法
public int getDaysBetween (Calendar d1, Calendar d2) {
if (d1.after(d2)) { // swap dates so that d1 is start and d2 is end
java.util.Calendar swap = d1;
d1 = d2;
d2 = swap;
}
int days = d2.get(Calendar.DAY_OF_YEAR) - d1.get(Calendar.DAY_OF_YEAR);
int y2 = d2.get(Calendar.YEAR);
if (d1.get(Calendar.YEAR) != y2) {
d1 = (Calendar) d1.clone();
do {
days += d1.getActualMaximum(Calendar.DAY_OF_YEAR);//得到当年的实际天数
d1.add(Calendar.YEAR, 1);
} while (d1.get(Calendar.YEAR) != y2);
}
return days;
}
로그인 후 복사