您的位置:首页 > 编程语言 > Java开发

[学习笔记]Java日期类及其处理

2016-04-16 13:44 288 查看

1.概述

Date类是表示特定时间点的对象,精确到毫秒。
AsofJDK1.1,theCalendarclassshouldbeusedtoconvertbetweendatesandtimefieldsandtheDateFormatclassshouldbeusedtoformatandparsedatestrings.Thecorrespondingmethods
inDatearedeprecated.
JDK1.1及更新版本,应使用Calendar类来转换时间和日期,而DateFormat类来格式化日期或解析关于日期的字符串。此时Date类中相应的方法将被废弃。

2.构造器

以当前时间创建对象

Date()
以指定纪元时间创建对象

Date(longdate)


3.常用方法

判断时间点的先后

booleanafter(Datewhen)

booleanbefore(Datewhen)
获取或设置纪元时间

longgetTime()

voidsetTime(longtime)


4.示例

Datedate=newDate(1420000000000l);//纪元毫秒时间转换日期对象
longmillisTime=date.getTime();//日期对象转换纪元毫秒时间


Calendar类

1.概述

Calendar类是个日历表示法的抽象类,可以通过其静态方法获取当前时间日期的对象
Calendar类维护了非常多的字段,可以提供关于日历的各种信息以及转换方法。
实际上,通过静态方法获得的Calendar对象为其子类GregorianCalendar对象,所以也可以直接创建其子类对象进行处理。


2.常用字段

年,月,日

YEAR,MONTH,DAY_OF_MONTH/DATE
时,分,秒,毫秒

HOUR_OF_DAY,MINUTE,SECOND,MILLISECOND
本周星期几,本年第几天,本月第几周,本月第几个7天,本年第几周

DAY_OF_WEEK,DAY_OF_YEAR,WEEK_OF_YEAR,DAY_OF_WEEK_IN_MONTH,WEEK_OF_YEAR
公元,上下午

ERA,AM_PM
12小时计时

HOUR
星期(DAY_OF_WEEK取值范围)

SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY
月份(MONTH取值范围,其中JANUARY为0)

JANUARY,FEBRUARY,MARCH,APRIL,MAY,JUNE,JULY,AUGUST,SEPTEMBER,OCTOBER,NOVEMBER,DECEMBER

3.常用方法

使用当前日期时间以及默认时区本地化获取日历对象

staticCalendargetInstance();
获取/设置当前日历的时间

DategetTime()

voidsetTime(Datedate)
按毫秒单位时间设置日历时间

voidsetTimeInMillis(longmillis)
获取指定字段的值

intget(intfield)
更改指定字段的值

voidset(intfield,intvalue);

voidset(intyear,intmonth,intdate)

voidset(intyear,intmonth,intdate,inthourOfDay,intminute)

voidset(intyear,intmonth,intdate,inthourOfDay,intminute,intsecond)
按给定的偏移更改当前日期时间

abstractvoidadd(intfield,intamount)
获取该日期指定字段的最大值或最小。

intgetActualMaximum(intfield)

intgetActualMinimum(intfield)
获取/设置每周第一天是星期几

intgetFirstDayOfWeek()

voidsetFirstDayOfWeek(intvalue)

4.示例

Calendarcal=Calendar.getInstance();//以当前日期时间初始化日历
cal.set(Calendar.MONTH,Calendar.DECEMBER);//设置日历为十一月
intmonth=cal.get(Calendar.MONTH);//获取日信息
intmaxMonth=cal.getActualMaximum(Calendar.DAY_OF_MONTH);//获取当前日期月的天数。
System.out.println("月:"+(month+1)+"\n该月天数"+maxMonth);


5.子类:GregorianCalendar类

可以直接new该类对象完成日历功能的使用。
GregorianCalendar类扩展了Calendar类的功能,可以直接通过年月日时分秒的方式创建对象。

GregorianCalendar()

GregorianCalendar(intyear,intmonth,intdayOfMonth)

GregorianCalendar(intyear,intmonth,intdayOfMonth,inthourOfDay,intminute)

GregorianCalendar(intyear,intmonth,intdayOfMonth,inthourOfDay,intminute,intsecond)
GregorianCalendar类提供了世界上大多数历法表示方法。
GregorianCalendar类提供了判断闰年的方法

booleanisLeapYear(intyear)


DateFormat类


1.概述

FormateDemo类,该类为抽象类,但是提供了Instance方法可以实现标准样式的格式化和解析。
和Calendar类类似,如需要自定义样式可以使用其子类SimpleDateFormat。


2.字段

SHORTyy-M-d上午/下午h:mm
MEDIUMyyyy-M-dh:mm:ss
LONGyyyy年M月d日上午/下午hh时mm分ss秒
FULLyyyy年M月d日星期上午/下午hh时mm分ss秒CST


3.方法

按指定标准样式初始化DateFormat对象

staticDateFormatgetInstance();//默认风格SHORT

staticDateFormatgetDateInstance();//默认风格MEDIUM

staticDateFormatgetTimeInstance();//默认风格MEDIUM

staticDateFormatgetDateTimeInstance();//默认风格MEDIUM
将日期对象按指定标准样式转化为字符串

Stringformat(Datedate);
将字符串按指定标准样式解析为日期对象

Dateparse(Stringsource);

4.示例

Datedate=newDate(1391234567891l);
//指定标准样式
DateFormatdateStaFormat=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.MEDIUM);
Stringdate_Sta_str=dateStaFormat.format(date);//格式化,2014年2月1日14:02:47
StringdateTime="2014年11月15日14:16:50";
try{
DatenowDateTime=dateStaFormat.parse(dateTime);//解析,SatNov1514:16:50CST2014
longmillisTime=nowDateTime.getTime();//1416032210000
}catch(ParseExceptione){
e.printStackTrace();
}



SimpleDateFormat类

1.概述

SimpleDateFormat类是DateFormat的子类,和Calendar类似,DateFormat类通过工厂方法获得的对象就是SimpleDateFormat类对象。
SimpleDateFormat类可以按指定样式创建对象,可以自定义日期时间的格式。


2.日期和时间模式

其中,未加''的字母将被识别为模式,所以非匹配字母需要加''以示区分。

LetterDateorTimeComponentPresentationExamples
G
EradesignatorText
AD
y
YearYear
1996
;
96
Y
WeekyearYear
2009
;
09
M
Monthinyear(contextsensitive)Month
July
;
Jul
;
07
L
Monthinyear(standaloneform)Month
July
;
Jul
;
07
w
WeekinyearNumber
27
W
WeekinmonthNumber
2
D
DayinyearNumber
189
d
DayinmonthNumber
10
F
DayofweekinmonthNumber
2
E
DaynameinweekText
Tuesday
;
Tue
u
Daynumberofweek(1=Monday,...,7=Sunday)Number
1
a
Am/pmmarkerText
PM
H
Hourinday(0-23)Number
0
k
Hourinday(1-24)Number
24
K
Hourinam/pm(0-11)Number
0
h
Hourinam/pm(1-12)Number
12
m
MinuteinhourNumber
30
s
SecondinminuteNumber
55
S
MillisecondNumber
978
z
TimezoneGeneraltimezone
PacificStandardTime
;
PST
;
GMT-08:00
Z
TimezoneRFC822timezone
-0800
X
TimezoneISO8601timezone
-08
;
-0800
;
-08:00
示例

DateandTimePatternResult
"yyyy.MM.ddG'at'HH:mm:ssz"
2001.07.04ADat12:08:56PDT
"EEE,MMMd,''yy"
Wed,Jul4,'01
"h:mma"
12:08PM
"hh'o''clock'a,zzzz"
12o'clockPM,PacificDaylightTime
"K:mma,z"
0:08PM,PDT
"yyyyy.MMMMM.ddGGGhh:mmaaa"
02001.July.04AD12:08PM
"EEE,dMMMyyyyHH:mm:ssZ"
Wed,4Jul200112:08:56-0700
"yyMMddHHmmssZ"
010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"
2001-07-04T12:08:56.235-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX"
2001-07-04T12:08:56.235-07:00
"YYYY-'W'ww-u"
2001-W27-3

3.构造器

SimpleDateFormat()

SimpleDateFormat(Stringpattern)

SimpleDateFormat(Stringpattern,DateFormatSymbolsformatSymbols)

SimpleDateFormat(Stringpattern,Localelocale)

4.常用方法

更换指定样式

voidapplyPattern(Stringpattern)

5.示例

Datedate=newDate(1391234567891l);
//指定样式
SimpleDateFormatdateFormat=newSimpleDateFormat("yyyy/MM/dd'at'HH:mm:ss.SSS");
Stringdate_str=dateFormat.format(date);//格式化,2014/02/01at14:02:47.891
dateFormat.applyPattern("yyyy.MM.dd");//更换样式
StringdateTime="2014.11.15";
try{
DatenowDateTime=dateFormat.parse(dateTime);//解析,SatNov1500:00:00CST2014
}catch(ParseExceptione){
e.printStackTrace();
}



Date,Calendar和DateFormat的关系

1.Date和Calendar可以相互转换。
2.Date和DateFormat配合格式化和解析。
3.也就是说Date可以作为桥梁存在。
4.示例

packagedate;
importjava.text.DateFormat;
importjava.text.ParseException;
importjava.util.Calendar;
importjava.util.Date;
publicclassGregorianCalendarDemo{
publicstaticvoidmain(String[]args)throwsParseException{
Datedate=newDate();
Calendarcal=Calendar.getInstance();
DateFormatdf=DateFormat.getInstance();
//1.Date<->Calendar
Calendardate2cal=Calendar.getInstance();
date2cal.setTime(date);
Datecal2date=cal.getTime();
//2.Date<->DateFormat
Stringtime=df.format(date);//"14-12-16下午11:47"
Datedf2date=df.parse(time);//TueDec1623:48:00CST2014
}
}



案例

1.时间转换和简单计算

packagedate;
importjava.text.DateFormat;
importjava.text.ParseException;
importjava.text.SimpleDateFormat;
importjava.util.Calendar;
importjava.util.Date;
publicclassDateText{
publicstaticvoidmain(String[]args){
/*
*1.将毫秒时间转换为指定日期格式:xxxx年x月x日h:m:s
*2."2014/11/11"转成日期对象。
*3."2014-11-11"到"2015年4月29日"到底有多少天?
*4.获取给定年份到现在每年的2月有多少天?
*/
//1.将毫秒时间转换为指定日期格式:xxxx年x月x日h:m:s
Datedate=newDate(1400000000000l);
DateFormatdateFormat=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.MEDIUM);
StringdateString=dateFormat.format(date);
System.out.println(dateString);
//2."2014/11/11"转成日期对象。
SimpleDateFormatsDateFormat=newSimpleDateFormat("yyyy/MM/dd");
try{
date=sDateFormat.parse("2014/11/11");
System.out.println(date);
}catch(ParseExceptione){
System.out.println("解析错误!");
e.printStackTrace();
}
//3."2014-11-11"到"2015年4月29日"到底有多少天?
StringdateString1="2014-11-11";
StringdateString2="2015年4月29日";
intdateStyle1=DateFormat.MEDIUM;
intdateStyle2=DateFormat.LONG;
intdays;
try{
days=calculateDays(dateString1,dateStyle1,dateString2,dateStyle2);
System.out.println(dateString1+"到"+dateString2+"间有"+days+"天");
}catch(ParseExceptione){
System.out.println("解析错误!");
e.printStackTrace();
}
//4.获取给定年份到现在每年的2月有多少天,最后一天星期几?
intyear=1989;
intendYear=Calendar.getInstance().get(Calendar.YEAR);
for(;year<=endYear;year++){
show(year);
}
}
publicstaticvoidshow(intyear){
Calendarcal=Calendar.getInstance();
cal.set(year,2,1);
cal.add(Calendar.DAY_OF_MONTH,-1);
System.out.println(year+"年二月包含"+cal.get(Calendar.DAY_OF_MONTH)+"天,最后一天是"
+getDayInWeek(cal.get(Calendar.DAY_OF_WEEK)));
}
publicstaticStringgetDayInWeek(intdayOfWeek){
if(dayOfWeek<1||dayOfWeek>7){
thrownewRuntimeException(dayOfWeek+":没有对应的星期!");
}
String[]week={"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
returnweek[dayOfWeek];
}
publicstaticintcalculateDays(StringdateString1,intdateStyle1,StringdateString2,
intdateStyle2)throwsParseException{
longdateMillis1=DateFormat.getDateInstance(dateStyle1).parse(dateString1).getTime();
longdateMillis2=DateFormat.getDateInstance(dateStyle2).parse(dateString2).getTime();
longmargin=Math.abs(dateMillis1-dateMillis2);
return(int)(margin/1000/60/60/24);
}
}


2.打印当月的日历,今天用*标注

packagedate;
importjava.text.DateFormatSymbols;
importjava.util.Calendar;
publicclassCalendarTest{
publicstaticvoidmain(String[]args){
//打印当月的日历
Calendarcal=Calendar.getInstance();
//获取今天日期和月份
inttoday=cal.get(Calendar.DAY_OF_MONTH);
intmonth=cal.get(Calendar.MONTH);
//将日历指向本月第一天
cal.set(Calendar.DAY_OF_MONTH,1);
//本月第一天是星期几,以及一周的第一天是星期几
intweekday=cal.get(Calendar.DAY_OF_WEEK);
intfirstDayOfWeek=cal.getFirstDayOfWeek();
//判断日历第一行第一列是哪一天
intdaysInLastMonth=0;
while(weekday!=firstDayOfWeek){
//如果本月第一天不是一周的第一天,那么日历指向前一天
daysInLastMonth++;
cal.add(Calendar.DAY_OF_MONTH,-1);
weekday=cal.get(Calendar.DAY_OF_WEEK);
}
//打印星期名
String[]weekdayName=newDateFormatSymbols().getWeekdays();
do{
System.out.printf("%6s",weekdayName[weekday]);
cal.add(Calendar.DAY_OF_MONTH,1);
weekday=cal.get(Calendar.DAY_OF_WEEK);
}while(weekday!=firstDayOfWeek);
System.out.println();
//打印第一行属于上个月日期的空格
for(inti=0;i<daysInLastMonth;i++){
System.out.print("");
}
//打印日期
cal.set(Calendar.DAY_OF_MONTH,1);
while(month==cal.get(Calendar.MONTH)){
intday=cal.get(Calendar.DAY_OF_MONTH);
System.out.printf("%5d",day);
//如果是今天,则打印*
if(day==today){
System.out.print("*");
}else{
System.out.print("");
}
//日历步进
cal.add(Calendar.DAY_OF_MONTH,1);
weekday=cal.get(Calendar.DAY_OF_WEEK);
//如果一行结束,加入换行符
if(weekday==firstDayOfWeek){
System.out.println();
}
}
//如果该月结束不在一行的末尾,则加入一换行符
if(weekday!=firstDayOfWeek){
System.out.println();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: