JAVA面试题解惑系列日期和时间的处理Word文档格式.docx
《JAVA面试题解惑系列日期和时间的处理Word文档格式.docx》由会员分享,可在线阅读,更多相关《JAVA面试题解惑系列日期和时间的处理Word文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
请看下面的例子:
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:
return();
returnnull;
publicstaticvoidmain(Stringargs)Calendarc1=();
创建方式:
日期时间:
Calendarc2=newGregorianCalendar();
/参数含义依次为:
年、月、日Calendarc3=newGregorianCalendar(2008,8,8);
年、月、日、时、分Calendarc4=newGregorianCalendar(2008,8,8,6,10);
年、月、日、时、分、秒Calendarc5=newGregorianCalendar(2008,8,8,18,10,5);
运行结果如下:
1.创建方式:
()2.日期时间:
2008年07月22日11:
54:
483.4.创建方式:
newGregorianCalendar()5.日期时间:
486.7.创建方式:
newGregorianCalendar(2008,8,8.日期时间:
2008年09月08日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:
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:
);
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!
publicstaticvoidmain(Stringargs)Calendarc=();
当前时刻:
属性名称:
代表含义:
测试结果:
星期日:
星期一:
星期二:
星期三:
星期四:
星期五:
星期六:
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.属性名称:
这一天所对应的星期几在该月中是第几次出现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.属性名称:
一个月中的第几个星期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;
hh;
HH;
mm;
ss;
SS;
EE;
aa;
zz;
19./调用SimpleDateFormat的applyPattern(Stringpattern)方法用新创建的日期格式表达式替换其原有的20.(pattern);
21.2位:
22.23.pattern=年代:
GGG;
yyy;
MMM;
ddd;
hhh;
HHH;
mmm;
sss;
SSS;
EEE;
aaa;
zzz;
24.(pattern);
25.3位:
26.27.pattern=年代:
GGGG;
yyyy;
MMMM;
dddd;
hhhh;
HHHH;
mmmm;
ssss;
SSSS;
EEEE;
aaaa;
zzzz;
28.(pattern);
29.4位:
30.31.pattern=年代:
GGGGG;
yyyyy;
MMMMM;
ddddd;
hhhhh;
HHHHH;
mmmmm;
sssss;
SSSSS;
EEEEE;
aaaaa;
zzzzz;
32.(pattern);
33.5位:
34.35.pattern=年代:
GGGGGG;
yyyyyy;
MMMMMM;
dddddd;
hhhhhh;
HHHHHH;
mmmmmm;
ssssss;
SSSSSS;
EEEEEE;
aaaaaa;
zzzzzz;
36.(pattern);
37.6位:
38.39.importclassDateTestpublicstaticvoidmain(Stringargs)/使用系统当前日期时间值创建一个Date对象Datenow=newDate();
/创建一个日期格式表达式Stringpattern=年代:
/使用日期格式表达式创建一个SimpleDateFormat对象SimpleDateFormatdf=newSimpleDateFormat(pattern);
/调用SimpleDateFormat类的format(Datedate)方法对Date对象进行格式化,并返回格式化后的字符串。
/该方法继承自类1位:
/创建一个新的日期格式表达式pattern=年代:
时(023