JAVA面试题解惑系列日期和时间的处理.docx
- 文档编号:8370963
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:25
- 大小:326.45KB
JAVA面试题解惑系列日期和时间的处理.docx
《JAVA面试题解惑系列日期和时间的处理.docx》由会员分享,可在线阅读,更多相关《JAVA面试题解惑系列日期和时间的处理.docx(25页珍藏版)》请在冰豆网上搜索。
JAVA面试题解惑系列日期和时间的处理面试题解惑系列日期和时间的处理JAVA面试题解惑系列(七)日期和时间的处理(总19页)JAVA面试题解惑系列(七)日期和时间的处理日期和时间的处理不仅在面试题中会考到,在实际项目开发中也是我们经常需要处理的问题,似乎没有哪个项目可以避开它们,我们常常在处理用户的出生年月日、注册日期,订单的创建时间等属性时用到,由此可见其重要性。
类提到日期和时间,我想大家最先想到应该是类吧。
Date类可以精确到毫秒数,这个毫秒数是相对于格林威治标准时间“1970-01-0100:
00:
GMT”的差值。
那么,什么是格林威治标准时间呢?
要回答这个问题,我们需要先来了解一下世界时间标准方面的知识。
世界时间标准主要有UTC,即CoordinatedUniversalTime(中文名译作世界协调时间、世界统一时间或世界标准时间),以及GMT,即GreenwichMeanTime(中文名译作格林威治标准时间或格林威治平均时间)两种。
严格来讲,UTC比GMT更加精确一些,不过它们的差值不会超过秒,如果超过了,将会为UTC增加闰秒以与GMT,也就是地球自转周期保持一致。
所以在日常使用中,我们可以把UTC和GMT一样看待。
日期和时间的表示是与我们所处的时区相关联的,如果我们不指定时区,那么它们将以系统默认的时区来显示。
我们先来看看如何创建日期对象。
Date类有很多个构造器方法,大部分已经不被赞成使用了(Deprecated),不过还剩下两个可以使用的:
Java代码1.publicDate()2.this();3.4.5.publicDate(longdate)1.rint(比较结果:
1900-01-0120:
00:
00在2008-08-0820:
00:
00);2.rint(比较结果:
2008-08-0820:
00:
00在1900-01-0120:
00:
00);3.rint(比较结果:
1900-01-0120:
00:
00在2008-08-0820:
00:
00);rint(比较结果:
2008-08-0820:
00:
00在1900-01-0120:
00:
00);rint(比较结果:
1900-01-0120:
00:
00在2008-08-0820:
00:
00);/使用compareTo()方法比较inti=(d2008);if(i=-1)之前);elseif(i=1)之后);elseif(i=0)是同一时刻);运行结果:
1.调用方法:
(d2008)2.比较结果:
1900-01-0120:
00:
00在2008-08-0820:
00:
00之前3.4.调用方法:
(d1900)5.比较结果:
2008-08-0820:
00:
00在1900-01-0120:
00:
00之后6.7.调用方法:
(d2008)8.比较结果:
1900-01-0120:
00:
00在2008-08-0820:
00:
00之前那么如果我们想直接获取或者改变年、月、日、时、分、秒等等这些属性的值时怎么办呢?
Date类当然有完成这些操作的方法,不过遗憾的是它们也都已经不被赞成使用了。
我们必须换一个能够提供这些操作的类,这个类就是。
公历历法Calendar是一个抽象类,我们无法直接实例化它,它有一个具体子类实体类,这个类实现的就是我们日常所用的公历历法,或者叫做阳历。
我们可以直接使用new命令创建它的实例,或者使用Calendar类的这个方法来获得它实例:
Java代码1.publicstaticCalendargetInstance()2./othercode3.publicstaticCalendargetInstance()/othercode采用上面这个方法时,我们创建的Calendar对象的日期和时间值是对象被创建时系统日期和时间值。
当使用new命令时,我们有两种选择,一种是使用系统当前的日期和时间值初始化GregorianCalendar对象;另一种是通过给定年、月、日、时、分、秒等属性值来对其进行初始化。
请看下面的例子:
Java代码1.import2.import3.import4.import5.6.publicclassDateTest7./*8.*以一种较为友好的方式格式化日期时间值9.*10.*paramc11.*日期时间对象12.*return格式化后的日期时间字符串13.*/14.publicstaticStringtoFriendlyString(Calendarc)15.if(c!
=null)16.DateFormatdf=newSimpleDateFormat(yyyy年MM月dd日HH:
mm:
ss);17.return();18.19.returnnull;20.21.22.publicstaticvoidmain(Stringargs)23.Calendarc1=();24.创建方式:
();25.日期时间:
+(c1);26.27.28.Calendarc2=newGregorianCalendar();29.创建方式:
newGregorianCalendar();30.日期时间:
+(c2);31.32.33./参数含义依次为:
年、月、日34.Calendarc3=newGregorianCalendar(2008,8,8);35.创建方式:
newGregorianCalendar(2008,8,8);36.日期时间:
+(c3);37.38.39./参数含义依次为:
年、月、日、时、分40.Calendarc4=newGregorianCalendar(2008,8,8,6,10);41.创建方式:
newGregorianCalendar(2008,8,8,6,10);42.日期时间:
+(c4);43.44.45./参数含义依次为:
年、月、日、时、分、秒46.Calendarc5=newGregorianCalendar(2008,8,8,18,10,5);47.创建方式:
newGregorianCalendar(2008,8,8,18,10,5);48.日期时间:
+(c5);49.50.importclassDateTest/*以一种较为友好的方式格式化日期时间值*paramc*日期时间对象*return格式化后的日期时间字符串*/publicstaticStringtoFriendlyString(Calendarc)if(c!
=null)DateFormatdf=newSimpleDateFormat(yyyy年MM月dd日HH:
mm:
ss);return();returnnull;publicstaticvoidmain(Stringargs)Calendarc1=();创建方式:
();日期时间:
+(c1);Calendarc2=newGregorianCalendar();创建方式:
newGregorianCalendar();日期时间:
+(c2);/参数含义依次为:
年、月、日Calendarc3=newGregorianCalendar(2008,8,8);创建方式:
newGregorianCalendar(2008,8,8);日期时间:
+(c3);/参数含义依次为:
年、月、日、时、分Calendarc4=newGregorianCalendar(2008,8,8,6,10);创建方式:
newGregorianCalendar(2008,8,8,6,10);日期时间:
+(c4);/参数含义依次为:
年、月、日、时、分、秒Calendarc5=newGregorianCalendar(2008,8,8,18,10,5);创建方式:
newGregorianCalendar(2008,8,8,18,10,5);日期时间:
+(c5);运行结果如下:
1.创建方式:
()2.日期时间:
2008年07月22日11:
54:
483.4.创建方式:
newGregorianCalendar()5.日期时间:
2008年07月22日11:
54:
486.7.创建方式:
newGregorianCalendar(2008,8,8.日期时间:
2008年09月08日00:
00:
009.10.创建方式:
newGregorianCalendar(2008,8,8,6,10)11.日期时间:
2008年09月08日06:
10:
0012.13.创建方式:
newGregorianCalendar(2008,8,8,18,10,5)14.日期时间:
2008年09月08日18:
10:
05为了便于阅读,我们增加一个toFriendlyString(Calendarc)方法,它将日期时间值格式化为一种更加友好易懂的形式,我们将在接下来的内容中讲解它的实现原理。
分析运行结果后,我们发现有两个地方需要注意:
1.在创建GregorianCalendar对象时,月份值都设定为8,但打印结果都是9月份。
这并不是我们的代码有问题,而是因为JAVA表示的月份是从0开始的,也就是说它用来表示月份的数值总是比实际月份值小1。
因此我们要表示8月份,就是应该设置8-1=7这个值。
2.GregorianCalendar的小时数是24小时制的。
为了避免出现因为忘记处理1的差值而设置了错误的月份,也让代码看起来更加直观,推荐大家使用定义在Calendar类的的这些常量来代替直接用数字表示月份:
一月:
=0二月:
=1三月:
=2四月:
=3五月:
=4六月:
=5七月:
=6八月:
=7九月:
=8十月:
=9十一月:
=10十二月:
=11如果我们想要从Calendar对象获得各种属性的值,就需要调用它的get(intfield)方法,这个方法接收一个int型的参数,并且根据这个给定参数的值来返回相应的属性的值。
该方法的定义如下:
Java代码1.publicintget(intfield)2./othercode3.publicintget(intfield)/othercode我们以一个示例来说明get(intfield)方法所能接受的一些常用参数的含义及用法:
Java代码1.import2.import3.import4.5.publicclassDateTest6./*7.*以一种较为友好的方式格式化日期时间值8.*9.*paramc10.*日期时间对象11.*return格式化后的日期时间字符串12.*/13.publicstaticStringtoFriendlyString(Calendarc)14.if(c!
=null)15.DateFormatdf=newSimpleDateFormat(yyyy年MM月dd日HH:
mm:
);16.return();17.18.returnnull;19.20.21.publicstaticvoidmain(Stringargs)22.Calendarc=();23.当前时刻:
+(c);24.25.26.属性名称:
);27.代表含义:
上下午标识,上午返回=0,下午返回=1);28.测试结果:
+);29.30.31.属性名称:
);32.代表含义:
一个月中的第几天,同);33.测试结果:
+);34.35.36.属性名称:
);37.代表含义:
一个月中的第几天,同);38.测试结果:
+);39.40.41.属性名称:
);42.代表含义:
一周中的第几天,对应星期几,第一天为星期日,于此类推。
);43.星期日:
=1);44.星期一:
=2);45.星期二:
=3);46.星期三:
=4);47.星期四:
=5);48.星期五:
=6);49.星期六:
=7);50.测试结果:
+);51.52.53.属性名称:
);54.代表含义:
这一天所对应的星期几在该月中是第几次出现);55.测试结果:
+);56.57.58.属性名称:
);59.代表含义:
一年中的第几天);60.测试结果:
+);61.62.63.属性名称:
);64.代表含义:
12小时制下的小时数,中午和午夜表示为0);65.测试结果:
+);66.67.68.属性名称:
);69.代表含义:
24小时制下的小时数,午夜表示为0);70.测试结果:
+);71.72.73.属性名称:
);74.代表含义:
毫秒数);75.测试结果:
+);76.77.78.属性名称:
);79.代表含义:
分钟);80.测试结果:
+);81.82.83.属性名称:
);84.代表含义:
月份,从0到11表示12个月份,比实际月份值小1);85.测试结果:
+);86.87.88.属性名称:
);89.代表含义:
秒);90.测试结果:
+);91.92.93.属性名称:
);94.代表含义:
一个月中的第几个星期);95.测试结果:
+);96.97.98.属性名称:
);99.代表含义:
一年中的第几个星期);100.测试结果:
+);101.102.103.属性名称:
);104.代表含义:
年份);105.测试结果:
+);106.107.importclassDateTest/*以一种较为友好的方式格式化日期时间值*paramc*日期时间对象*return格式化后的日期时间字符串*/publicstaticStringtoFriendlyString(Calendarc)if(c!
=null)DateFormatdf=newSimpleDateFormat(yyyy年MM月dd日HH:
mm:
);return();returnnull;publicstaticvoidmain(Stringargs)Calendarc=();当前时刻:
+(c);属性名称:
);代表含义:
上下午标识,上午返回=0,下午返回=1);测试结果:
+);属性名称:
);代表含义:
一个月中的第几天,同);测试结果:
+);属性名称:
);代表含义:
一个月中的第几天,同);测试结果:
+);属性名称:
);代表含义:
一周中的第几天,对应星期几,第一天为星期日,于此类推。
);星期日:
=1);星期一:
=2);星期二:
=3);星期三:
=4);星期四:
=5);星期五:
=6);星期六:
=7);测试结果:
+);属性名称:
);代表含义:
这一天所对应的星期几在该月中是第几次出现);测试结果:
+);属性名称:
);代表含义:
一年中的第几天);测试结果:
+);属性名称:
);代表含义:
12小时制下的小时数,中午和午夜表示为0);测试结果:
+);属性名称:
);代表含义:
24小时制下的小时数,午夜表示为0);测试结果:
+);属性名称:
);代表含义:
毫秒数);测试结果:
+);属性名称:
);代表含义:
分钟);测试结果:
+);属性名称:
);代表含义:
月份,从0到11表示12个月份,比实际月份值小1);测试结果:
+);属性名称:
);代表含义:
秒);测试结果:
+);属性名称:
);代表含义:
一个月中的第几个星期);测试结果:
+);属性名称:
);代表含义:
一年中的第几个星期);测试结果:
+);属性名称:
);代表含义:
年份);测试结果:
+);运行结果如下:
1.当前时刻:
2008年07月22日13:
16:
2.3.属性名称:
4.代表含义:
上下午标识,上午返回=0,下午返回=15.测试结果:
16.7.属性名称:
8.代表含义:
一个月中的第几天,同9.测试结果:
2210.11.属性名称:
12.代表含义:
一个月中的第几天,同13.测试结果:
2214.15.属性名称:
16.代表含义:
一周中的第几天,对应星期几,第一天为星期日,于此类推。
17.星期日:
=118.星期一:
=219.星期二:
=320.星期三:
=421.星期四:
=522.星期五:
=623.星期六:
=724.测试结果:
325.26.属性名称:
27.代表含义:
这一天所对应的星期几在该月中是第几次出现28.测试结果:
429.30.属性名称:
31.代表含义:
一年中的第几天32.测试结果:
20433.34.属性名称:
35.代表含义:
12小时制下的小时数,中午和午夜表示为036.测试结果:
137.38.属性名称:
39.代表含义:
24小时制下的小时数,午夜表示为040.测试结果:
1341.42.属性名称:
43.代表含义:
毫秒数44.测试结果:
42145.46.属性名称:
47.代表含义:
分钟48.测试结果:
1649.50.属性名称:
51.代表含义:
月份,从0到11表示12个月份,比实际月份值小152.测试结果:
653.54.属性名称:
55.代表含义:
秒56.测试结果:
757.58.属性名称:
59.代表含义:
一个月中的第几个星期60.测试结果:
461.62.属性名称:
63.代表含义:
一年中的第几个星期64.测试结果:
3065.66.属性名称:
67.代表含义:
年份68.测试结果:
2008其中代表的含义比较难理解一些,它表示“这一天所对应的星期几在该月中是第几次出现”。
比如2008年8月8日是星期五,在它之前的8月1日也是星期五,因此它是8月份的第二个星期五。
所以这时调用get就会返回2。
这里存在一个简单易记的规律:
对于每月的1-7号,它们一定占全了星期一到星期日,所以不管是它们中的哪一天,也不管这一天是星期几,它总是第一个,因此返回1;8-14号也同样占全了星期一到星期日,但由于1-7号的关系,对于它们总是返回2;以此类推,15-21号返回3,22-28号返回4,29-31号返回5。
Calendar对象和Date对象可以通过Calendar类的如下两个方法进行相互转换:
Java代码1.publicfinalDategetTime()2./othercode3.4.5.publicfinalvoidsetTime(Datedate)6./othercode7.publicfinalDategetTime()/othercodepublicfinalvoidsetTime(Datedate)/othercode日期格式化与解析我们回头再来看看在上面的例子中定义的toFriendlyString(Calendarc)方法,它将一个Calendar对象的日期时间值以一种很友好的方式来展现,使人们很容易看懂,也符合我们中国人的习惯。
这完全得益于抽象类DateFormat以及它的子类实体类SimpleDateFormat的帮助。
这两个类都位于包中,是专门用于日期格式化和解析的类。
而这两项工作的核心就是我们为此设定的Pattern,我们可以称之为“日期格式表达式”。
理论上讲日期格式表达式包含全部26个英文字母的大小写,不过它们中的一些字母只是被预留了,并没有确切的含义。
目前有效的字母及它们所代表的含义如下:
G:
年代标识,表示是公元前还是公元后y:
年份M:
月份d:
日h:
小时,从1到12,分上下午H:
小时,从0到23m:
分钟s:
秒S:
毫秒E:
一周中的第几天,对应星期几,第一天为星期日,于此类推z:
时区D:
一年中的第几天F:
这一天所对应的星期几在该月中是第几次出现w:
一年中的第几个星期W:
一个月中的第几个星期a:
上午/下午标识k:
小时,从1到24K:
小时,从0到11,区分上下午在日期格式表达式中出现的所有字母,在进行日期格式化操作后,都将被其所代表的含义对应的属性值所替换,并且对某些字母来说,重复次数的不同,格式化后的结果也会有所不同。
请看下面的例子:
Java代码1.import2.import3.4.publicclassDateTest5.publicstaticvoidmain(Stringargs)6./使用系统当前日期时间值创建一个Date对象7.Datenow=newDate();8.9./创建一个日期格式表达式10.Stringpattern=年代:
G;年份:
y;月份:
M;日:
d;时(112):
h;时(023):
H;分:
m;秒:
s;毫秒:
S;星期:
E;上/下午:
a;时区:
z;11./使用日期格式表达式创建一个SimpleDateFormat对象12.SimpleDateFormatdf=newSimpleDateFormat(pattern);13./调用SimpleDateFormat类的format(Datedate)方法对Date对象进行格式化,并返回格式化后的字符串。
14./该方法继承自类15.1位:
+(now);16.17./创建一个新的日期格式表达式18.pattern=年代:
GG;年份:
yy;月份:
MM;日:
dd;时(112):
hh;时(023):
HH;分:
mm;秒:
ss;毫秒:
SS;星期:
EE;上/下午:
aa;时区:
zz;19./调用SimpleDateFormat的applyPattern(Stringpattern)方法用新创建的日期格式表达式替换其原有的20.(pattern);21.2位:
+(now);22.23.pattern=年代:
GGG;年份:
yyy;月份:
MMM;日:
ddd;时(112):
hhh;时(023):
HHH;分:
mmm;秒:
sss;毫秒:
SSS;星期:
EEE;上/下午:
aaa;时区:
zzz;24.(pattern);25.3位:
+(now);26.27.pattern=年代:
GGGG;年份:
yyyy;月份:
MMMM;日:
dddd;时(112):
hhhh;时(023):
HHHH;分:
mmmm;秒:
ssss;毫秒:
SSSS;星期:
EEEE;上/下午:
aaaa;时区:
zzzz;28.(pattern);29.4位:
+(now);30.31.pattern=年代:
GGGGG;年份:
yyyyy;月份:
MMMMM;日:
ddddd;时(112):
hhhhh;时(023):
HHHHH;分:
mmmmm;秒:
sssss;毫秒:
SSSSS;星期:
EEEEE;上/下午:
aaaaa;时区:
zzzzz;32.(pattern);33.5位:
+(now);34.35.pattern=年代:
GGGGGG;年份:
yyyyyy;月份:
MMMMMM;日:
dddddd;时(112):
hhhhhh;时(023):
HHHHHH;分:
mmmmmm;秒:
ssssss;毫秒:
SSSSSS;星期:
EEEEEE;上/下午:
aaaaaa;时区:
zzzzzz;36.(pattern);37.6位:
+(now);38.39.importclassDateTestpublicstaticvoidmain(Stringargs)/使用系统当前日期时间值创建一个Date对象Datenow=newDate();/创建一个日期格式表达式Stringpattern=年代:
G;年份:
y;月份:
M;日:
d;时(112):
h;时(023):
H;分:
m;秒:
s;毫秒:
S;星期:
E;上/下午:
a;时区:
z;/使用日期格式表达式创建一个SimpleDateFormat对象SimpleDateFormatdf=newSimpleDateFormat(pattern);/调用SimpleDateFormat类的format(Datedate)方法对Date对象进行格式化,并返回格式化后的字符串。
/该方法继承自类1位:
+(now);/创建一个新的日期格式表达式pattern=年代:
GG;年份:
yy;月份:
MM;日:
dd;时(112):
hh;时(023
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 试题 解惑 系列 日期 时间 处理
![提示](https://static.bdocx.com/images/bang_tan.gif)