[学习笔记]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:mmMEDIUMyyyy-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.日期和时间模式
其中,未加''的字母将被识别为模式,所以非匹配字母需要加''以示区分。Letter | DateorTimeComponent | Presentation | Examples |
---|---|---|---|
G | Eradesignator | Text | AD |
y | Year | Year | 1996; 96 |
Y | Weekyear | Year | 2009; 09 |
M | Monthinyear(contextsensitive) | Month | July; Jul; 07 |
L | Monthinyear(standaloneform) | Month | July; Jul; 07 |
w | Weekinyear | Number | 27 |
W | Weekinmonth | Number | 2 |
D | Dayinyear | Number | 189 |
d | Dayinmonth | Number | 10 |
F | Dayofweekinmonth | Number | 2 |
E | Daynameinweek | Text | Tuesday; Tue |
u | Daynumberofweek(1=Monday,...,7=Sunday) | Number | 1 |
a | Am/pmmarker | Text | 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 | Minuteinhour | Number | 30 |
s | Secondinminute | Number | 55 |
S | Millisecond | Number | 978 |
z | Timezone | Generaltimezone | PacificStandardTime; PST; GMT-08:00 |
Z | Timezone | RFC822timezone | -0800 |
X | Timezone | ISO8601timezone | -08; -0800; -08:00 |
DateandTimePattern | Result |
---|---|
"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();
}
}
}
相关文章推荐
- [学习笔记]Java常用工具类
- Eclipse_Java编码规范详细设置
- java入门
- [学习笔记]Java集合框架之Map集合
- SpringMVC表单标签简介
- [学习笔记]Java集合框架之Set集合
- [学习笔记]Java基本数据类型包装类
- [学习笔记]Java多线程经典问题
- [学习笔记]Java多线程
- [学习笔记]Java异常机制
- [学习笔记]Java模板方法和单例设计模式
- [学习笔记]Java抽象类和接口
- [学习笔记]Java数组和方法
- 更多的表单验证
- [学习笔记]Java排序算法之归并排序
- Java中常见的IO流及其使用
- [学习笔记]EXCEL导入功能java代码实现
- [学习笔记]使用java读取Excel表格中的数据
- [学习笔记]Java如何处理EXCEL的读取
- [学习笔记]struts.xml配置详解(所有基本配置,包括通配符)