??xml version="1.0" encoding="utf-8" standalone="yes"?> 一、Java中的日期概述 日期在Java中是一块非常复杂的内容Q对于一个日期在不同的语a国别环境中,日期的国际化Q日期和旉之间的{换,日期的加减运,日期的展C格式都是非常复杂的问题? 在Java中,操作日期主要涉及C下几个类Q? 1、java.util.Date 2、java.text.DateFormatQ抽象类Q? 3、java.text.SimpleDateFormatQDateFormat的直接子c) 4、java.util.CalendarQ抽象类Q? 5、java.util.GregorianCalendarQCalendar的直接子c) 1、java.util.Date的API? c?java.util.Date 表示特定的瞬__到毫U。提供了很多的方法,但是很多已经q时Q不推荐使用Q下面仅仅列出没有过时的ҎQ? 构造方法摘? Ҏ摘要 boolean before(Date when) Object clone() int compareTo(Date anotherDate) boolean equals(Object obj) long getTime() int hashCode() void setTime(long time) String toString() 下面是一个Datecȝl合实例: q行l果: Process finished with exit code 0 DateFormat 是日?旉格式化子cȝ抽象c,它以与语a无关的方式格式化q分析日期或旉。日?旉格式化子c(?SimpleDateFormatQ允许进行格式化Q也是日期 -> 文本Q、分析(文本-> 日期Q和标准化。将日期表示?Date 对象Q或者表CZؓ?GMTQ格林尼L准时_1970 q_1 ?1 ?00:00:00 q一d始的毫秒数? DateFormat 提供了很多类ҎQ以获得Z默认或给定语a环境和多U格式化风格的默认日?旉 Formatter。格式化风格包括 FULL、LONG、MEDIUM ?SHORT。方法描qC提供了用这些风格的更多l节和示例? DateFormat 可帮助进行格式化q分析Q何语a环境的日期。对于月、星期,甚至日历格式Q阴历和阛_Q,其代码可完全与语a环境的约定无兟? 要格式化一个当前语a环境下的日期Q可使用某个静态工厂方法: 如果格式化多个日期,那么获得该格式ƈ多次使用它是更ؓ高效的做法,q样pȝ׃必多ơ获取有关环境语a和国家约定的信息了? 要格式化不同语言环境的日期,可在 getDateInstance() 的调用中指定它? q可使用 DateFormat q行分析? 使用 getDateInstance 来获得该国家的标准日期格式。另外还提供了一些其他静态工厂方法。?getTimeInstance 可获得该国家的时间格式。?getDateTimeInstance 可获得日期和旉格式。可以将不同选项传入q些工厂ҎQ以控制l果的长度(?SHORT ?MEDIUM ?LONG 再到 FULLQ。确切的l果取决于语a环境Q但是通常Q? 如果愿意Q还可以在格式上讄时区。如果想Ҏ式化或分析施加更多的控制Q或者给予用h多的控制Q,可以试从工厂Ҏ所获得?DateFormat 强制转换?SimpleDateFormat。这适用于大多数国家Q只是要C其攑օ一?try 代码块中Q以防遇到特D的格式? q可以用借助 ParsePosition ?FieldPosition 的分析和格式化方法Ş式来Q逐步地分析字W串的各部分。对齐Q意特定的字段Q或者找出字W串在屏q上的选择位置? DateFormat 不是同步的。徏议ؓ每个U程创徏独立的格式实例。如果多个线E同时访问一个格式,则它必须保持外部同步? 3、java.text.SimpleDateFormatQDateFormat的直接子c)的? SimpleDateFormat 是一个以与语a环境相关的方式来格式化和分析日期的具体类。它允许q行格式化(日期 -> 文本Q、分析(文本 -> 日期Q和规范化? SimpleDateFormat 使得可以选择M用户定义的日?旉格式的模式。但是,仍然通过 DateFormat 中的 getTimeInstance、getDateInstance ?getDateTimeInstance 来新的创建日?旉格式化程序。每一个这LcL法都能够q回一个以默认格式模式初始化的日期/旉格式化程序。可以根据需要?applyPattern Ҏ来修Ҏ式模式。有关用这些方法的更多信息Q请参阅 DateFormat? 日期和时间模? 定义了以下模式字母(所有其他字W?'A' ?'Z' ?'a' ?'z' 都被保留Q: import java.util.Date; } public void testDateFormat() throws ParseException { //创徏不同的日期格? //日期按照不同格式进行输? //符合该格式的字W串转换为日期,若格式不盔RQ则会出? System.out.println("-------输出字W串转换为日期的l果------"); Process finished with exit code 0 4、java.util.CalendarQ抽象类Q? java.util.Calendar是个抽象c,是系l时间的抽象表示Q它为特定瞬间与一l诸?YEAR、MONTH、DAY_OF_MONTH、HOUR {日历字D之间的转换提供了一些方法,qؓ操作日历字段Q例如获得下星期的日期)提供了一些方法。瞬间可用毫U值来表示Q它是距历元Q即格林威治标准旉 1970 q?1 ?1 日的 00:00:00.000Q格里高利历Q的偏移量? 与其他语a环境敏感cMPCalendar 提供了一个类Ҏ getInstanceQ以获得此类型的一个通用的对象。Calendar ?getInstance Ҏq回一?Calendar 对象Q其日历字段已由当前日期和时间初始化? 一个Calendar的实例是pȝ旉的抽象表C,从Calendar的实例可以知道年月日星期月䆾时区{信息。CalendarcM有一个静态方?get(int x),通过q个Ҏ可以获取到相兛_例的一些|q月日星期月份等Q信息。参数x是一个量|在Calendar中有定义? Calendar中些陷阱Q很Ҏ掉下去: 5、java.util.GregorianCalendarQCalendar的直接子c) GregorianCalendar ?Calendar 的一个具体子c,提供了世界上大多数国家用的标准日历pȝ。结合Calendar抽象cM用? 下面l出一个综合实例看看Calendarcȝ用法Q? import java.util.*; } public void testCalendar() { //通过日期和毫U数讄Calendar now2.setTimeInMillis(new Date().getTime()); //定义日期的中文输出格?q输出日? System.out.println("--------通过Calendar获取日期中年月日{相关信?-------"); System.out.println("---------通用星期中文化{?--------"); System.out.println("---------通用月䆾中文化{?--------"); q行l果Q? --------通过Calendar获取日期中年月日{相关信?------- ---------通用星期中文化{?-------- ---------通用月䆾中文化{?--------
c?Date 表示特定的瞬__到毫U。从 JDK 1.1 开始,应该使用 Calendar cd现日期和旉字段之间转换Q?DateFormat cL格式化和分析日期字符丌ӀDate 中的把日期解释ؓq、月、日、小时、分钟和U值的Ҏ已废弃?
DateFormat 是日?旉格式化子cȝ抽象c,它以与语a无关的方式格式化q分析日期或旉。日?旉格式化子c(?SimpleDateFormatQ允许进行格式化Q也是日期 -> 文本Q、分析(文本-> 日期Q和标准化。将日期表示?Date 对象Q或者表CZؓ?GMTQ格林尼L准时_1970 q_1 ?1 ?00:00:00 q一d始的毫秒数?
SimpleDateFormat 是一个以与语a环境相关的方式来格式化和分析日期的具体类。它允许q行格式化(日期 -> 文本Q、分析(文本 -> 日期Q和规范化?
SimpleDateFormat 使得可以选择M用户定义的日?旉格式的模式。但是,仍然通过 DateFormat 中的 getTimeInstance、getDateInstance ?getDateTimeInstance 来新的创建日?旉格式化程序?
Calendar cL一个抽象类Q它为特定瞬间与一l诸?YEAR、MONTH、DAY_OF_MONTH、HOUR {日历字D之间的转换提供了一些方法,qؓ操作日历字段Q例如获得下星期的日期)提供了一些方法。瞬间可用毫U值来表示Q它是距历元Q即格林威治标准旉 1970 q?1 ?1 日的 00:00:00.000Q格里高利历Q的偏移量?
与其他语a环境敏感cMPCalendar 提供了一个类Ҏ getInstanceQ以获得此类型的一个通用的对象。Calendar ?getInstance Ҏq回一?Calendar 对象Q其日历字段已由当前日期和时间初始化?
GregorianCalendar ?Calendar 的一个具体子c,提供了世界上大多数国家用的标准日历pȝ?
GregorianCalendar 是一U合日历,在单一间断性的支持下同时支持儒略历和格里高利历pȝQ在默认情况下,它对应格里高利日历创立时的格里高利历日期Q某些国家是?1582 q?10 ?15 日创立,在其他国家要晚一些)。可p用方通过调用 setGregorianChange() 来更改v始日期?
二、java.util.Date的?
-------------
Date()
分配 Date 对象q用当前旉初始化此对象Q以表示分配它的旉Q精到毫秒Q?
Date(long date)
分配 Date 对象q初始化此对象,以表C从标准基准时_UCؓ“历元QepochQ?#8221;Q即 1970 q?1 ?1 ?00:00:00 GMTQ以来的指定毫秒数?
-------------
boolean after(Date when)
试此日期是否在指定日期之后?
试此日期是否在指定日期之前?
q回此对象的副本?
比较两个日期的顺序?
比较两个日期的相{性?
q回?1970 q?1 ?1 ?00:00:00 GMT 以来?Date 对象表示的毫U数?
q回此对象的哈希码倹{?
讄?Date 对象Q以表示 1970 q?1 ?1 ?00:00:00 GMT 以后 time 毫秒的时间点?
把此 Date 对象转换Z下Ş式的 StringQ?dow mon dd hh:mm:ss zzz yyyy 其中Q?
dow 是一周中的某一?(Sun, Mon, Tue, Wed, Thu, Fri, Sat)?
mon 是月?(Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)?
dd 是一月中的某一天(01 ?31Q,昄Z位十q制数?
hh 是一天中的小Ӟ00 ?23Q,昄Z位十q制数?
mm 是小时中的分钟(00 ?59Q,昄Z位十q制数?
ss 是分钟中的秒敎ͼ00 ?61Q,昄Z位十q制数?
zzz 是时区(q可以反映夏令时Q。标准时区羃写包括方?parse 识别的时区羃写。如果不提供时区信息Q则 zzz 为空Q即Ҏ不包括Q何字W?
yyyy 是年份,昄?4 位十q制数?
import java.util.Date;
public class TestDate {
public static void main(String args[]) {
TestDate nowDate = new TestDate();
nowDate.getSystemCurrentTime();
nowDate.getCurrentDate();
}
public void getSystemCurrentTime() {
System.out.println("----获取pȝ当前旉----");
System.out.println("pȝ当前旉 = " + System.currentTimeMillis());
}
public void getCurrentDate() {
System.out.println("----获取pȝ当前日期----");
//创徏q初始化一个日期(初始gؓ当前日期Q?
Date date = new Date();
System.out.println("现在的日期是 = " + date.toString());
System.out.println("?970q?????U开始至今所l历的毫U数 = " + date.getTime());
}
}
----获取pȝ当前旉----
pȝ当前旉 = 1196413077278
----获取pȝ当前日期----
现在的日期是 = Fri Nov 30 16:57:57 CST 2007
?970q?????U开始至今所l历的毫U数 = 1196413077278
2、java.text.DateFormat抽象cȝ使用
myString = DateFormat.getDateInstance().format(myDate);
DateFormat df = DateFormat.getDateInstance();
for (int i = 0; i < myDate.length; ++i) {
output.println(df.format(myDate[i]) + "; ");
}
DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE);
myDate = df.parse(myString);
SHORT 完全为数字,?12.13.52 ?3:30pm
MEDIUM 较长Q如 Jan 12, 1952
LONG 更长Q如 January 12, 1952 ?3:30:32pm
FULL 是完全指定,?Tuesday, April 12, 1952 AD ?3:30:42pm PST?
日期和时间格式由日期和时间模?字符串指定。在日期和时间模式字W串中,未加引号的字?'A' ?'Z' ?'a' ?'z' 被解释ؓ模式字母Q用来表C日期或旉字符串元素。文本可以用单引号 (') 引v来,以免q行解释?''" 表示单引受所有其他字W均不解释;只是在格式化时将它们单复制到输出字符Ԍ或者在分析时与输入字符串进行匹配?
字母 日期或时间元?表示 CZ
G Era 标志W?Text AD
y q?Year 1996; 96
M q中的月?Month July; Jul; 07
w q中的周?Number 27
W 月䆾中的周数 Number 2
D q中的天?Number 189
d 月䆾中的天数 Number 10
F 月䆾中的星期 Number 2
E 星期中的天数 Text Tuesday; Tue
a Am/pm 标记 Text PM
H 一天中的小时数Q?-23Q?Number 0
k 一天中的小时数Q?-24Q?Number 24
K am/pm 中的时敎ͼ0-11Q?Number 0
h am/pm 中的时敎ͼ1-12Q?Number 12
m 时中的分钟?Number 30
s 分钟中的U数 Number 55
S 毫秒?Number 978
z 时区 General time zone Pacific Standard Time; PST; GMT-08:00
Z 时区 RFC 822 time zone -0800
更多的参考信息可以查看JDK API文档,下面l出一个综合实?
import java.util.Locale;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class TestSimpleDateFormat {
public static void main(String args[]) throws ParseException {
TestSimpleDateFormat test = new TestSimpleDateFormat();
test.testDateFormat();
//创徏日期
Date date = new Date();
DateFormat df1 = DateFormat.getInstance();
DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss EE");
DateFormat df3 = DateFormat.getDateInstance(DateFormat.FULL, Locale.CHINA); //产生一个指定国家指定长度的日期格式Q长度不同,昄的日期完整性也不同
DateFormat df4 = new SimpleDateFormat("yyyyqMM月dd?hh时mm分ssU?EE", Locale.CHINA);
DateFormat df5 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss EEEEEE", Locale.US);
DateFormat df6 = new SimpleDateFormat("yyyy-MM-dd");
DateFormat df7 = new SimpleDateFormat("yyyyqMM月dd?);
System.out.println("-------日期按照不同格式进行输?-----");
System.out.println("按照Java默认的日期格式,默认的区?: " + df1.format(date));
System.out.println("按照指定格式 yyyy-MM-dd hh:mm:ss EE Q系l默认区?:" + df2.format(date));
System.out.println("按照日期的FULL模式Q区域设|ؓ中文 : " + df3.format(date));
System.out.println("按照指定格式 yyyyqMM月dd?hh时mm分ssU?EE Q区域ؓ中文 : " + df4.format(date));
System.out.println("按照指定格式 yyyy-MM-dd hh:mm:ss EE Q区域ؓ国 : " + df5.format(date));
System.out.println("按照指定格式 yyyy-MM-dd Q系l默认区?: " + df6.format(date));
Date date1 = df1.parse("07-11-30 下午2:32");
Date date2 = df2.parse("2007-11-30 02:51:07 星期?);
Date date3 = df3.parse("2007q?1?0?星期?);
Date date4 = df4.parse("2007q?1?0?02?1?8U?星期?);
Date date5 = df5.parse("2007-11-30 02:51:18 Friday");
Date date6 = df6.parse("2007-11-30");
System.out.println(date1);
System.out.println(date2);
System.out.println(date3);
System.out.println(date4);
System.out.println(date5);
System.out.println(date6);
}
}
q行l果:
-------日期按照不同格式进行输?-----
按照Java默认的日期格式,默认的区?: 07-11-30 下午5:04
按照指定格式 yyyy-MM-dd hh:mm:ss EE Q系l默认区?:2007-11-30 05:04:10 星期?
按照日期的FULL模式Q区域设|ؓ中文 : 2007q?1?0?星期?
按照指定格式 yyyyqMM月dd?hh时mm分ssU?EE Q区域ؓ中文 : 2007q?1?0?05?4?0U星期五
按照指定格式 yyyy-MM-dd hh:mm:ss EE Q区域ؓ国 : 2007-11-30 05:04:10 Friday
按照指定格式 yyyy-MM-dd Q系l默认区?: 2007-11-30
-------输出字W串转换为日期的l果------
Fri Nov 30 14:32:00 CST 2007
Fri Nov 30 02:51:07 CST 2007
Fri Nov 30 00:00:00 CST 2007
Fri Nov 30 02:51:18 CST 2007
Fri Nov 30 02:51:18 CST 2007
Fri Nov 30 00:00:00 CST 2007
1、Calendar的星期是从周日开始的Q常量gؓ0?
2、Calendar的月份是从一月开始的Q常量gؓ0?
3、Calendar的每个月的第一天gؓ1?
import java.text.SimpleDateFormat;
public class TestCalendar {
public static void main(String args[]) {
TestCalendar testCalendar = new TestCalendar();
testCalendar.testCalendar();
//创徏Calendar的方?
Calendar now1 = Calendar.getInstance();
Calendar now2 = new GregorianCalendar();
Calendar now3 = new GregorianCalendar(2007, 10, 30);
Calendar now4 = new GregorianCalendar(2007, 10, 30, 15, 55); //陷阱:Calendar的月份是0~11
Calendar now5 = new GregorianCalendar(2007, 10, 30, 15, 55, 44);
Calendar now6 = new GregorianCalendar(Locale.US);
Calendar now7 = new GregorianCalendar(TimeZone.getTimeZone("GMT-8:00"));
now2.setTime(new Date());
System.out.println(now2);
System.out.println(now2);
SimpleDateFormat df = new SimpleDateFormat("yyyyqMM月dd?hh时mm分ssU?E", Locale.CHINA);
System.out.println("获取日期中文格式化化输出Q? + df.format(now5.getTime()));
System.out.println();
System.out.println("获取q_" + now5.get(Calendar.YEAR));
System.out.println("获取?月䆾是从0开始的)Q? + now5.get(Calendar.MONTH));
System.out.println("获取日:" + now5.get(Calendar.DAY_OF_MONTH));
System.out.println("获取Ӟ" + now5.get(Calendar.HOUR));
System.out.println("获取分:" + now5.get(Calendar.MINUTE));
System.out.println("获取U:" + now5.get(Calendar.SECOND));
System.out.println("获取上午、下午:" + now5.get(Calendar.AM_PM));
System.out.println("获取星期数?星期是从周日开始的)Q? + now5.get(Calendar.DAY_OF_WEEK));
System.out.println();
String dayOfWeek[] = {"", "?, "一", "?, "?, "?, "?, "?};
System.out.println("now5对象的星期是:" + dayOfWeek[now5.get(Calendar.DAY_OF_WEEK)]);
System.out.println();
String months[] = {"一?, "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一?, "十二?};
System.out.println("now5对象的月份是: " + months[now5.get(Calendar.MONTH)]);
}
}
java.util.GregorianCalendar[time=1196414388324,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2007,MONTH=10,WEEK_OF_YEAR=48,WEEK_OF_MONTH=5,DAY_OF_MONTH=30,DAY_OF_YEAR=334,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=5,AM_PM=1,HOUR=5,HOUR_OF_DAY=17,MINUTE=19,SECOND=48,MILLISECOND=324,ZONE_OFFSET=28800000,DST_OFFSET=0]
java.util.GregorianCalendar[time=1196414388324,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2007,MONTH=10,WEEK_OF_YEAR=48,WEEK_OF_MONTH=5,DAY_OF_MONTH=30,DAY_OF_YEAR=334,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=5,AM_PM=1,HOUR=5,HOUR_OF_DAY=17,MINUTE=19,SECOND=48,MILLISECOND=324,ZONE_OFFSET=28800000,DST_OFFSET=0]
获取日期中文格式化化输出Q?007q?1?0?03?5?4U?星期?
获取q_2007
获取?月䆾是从0开始的)Q?0
获取日:30
获取Ӟ3
获取分:55
获取U:44
获取上午、下午:1
获取星期数?星期是从周日开始的)Q?
now5对象的星期是:?
now5对象的月份是: 十一?/span>
转蝲h明出?/span>Q谢谢!http://www.aygfsteel.com/zhangsenweiQ张炜JavaEE技术博客)