前言

日期时间的获取、显示是每个程序都会涉及到的,下面是一些记录以便日后查阅。

1 java.util.Date类

1
2
3
4
5
6
7
// 当前日期时间
Date now = new Date();
/* 由于程序的默认时区不同,可能显示如下内容:
* 1. 格林尼治时间,Tue Oct 28 01:24:14 GMT 2014
* 2. 美国中部标准时间,Tue Oct 27 23:24:14 GST 2014
*/
System.out.println(now);

从上面的示例可以知道除了 java.util.Date类 外我们还要了解时区 java.util.TimeZone 这个类才能得到需要的日期信息。

2 java.util.TimeZone类

示例1:

1
2
3
4
// 获取默认时区(最初始时由JVM决定的)
TimeZone defaultTZ = TimeZone.getDefault();
// 显示sun.util.calendar.ZoneInfo[id="GMT",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
System.out.println(defaultTZ);

示例2:

1
2
3
4
5
// 设置东八区为当前时区
TimeZone e8 = TimeZone.getTimeZone("GMT+8");
TimeZone.setDefault(e8);
// 显示sun.util.calendar.ZoneInfo[id="GMT+08:00",offset=28800000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
System.out.println(TimeZone.getDefault())

TimeZone.getTimeZone() 的入参为时区ID,可以通过 TimeZone.getAvaliableIDs() 可获取可用的时区ID。

好了,现在我们有了日期时间源数据就可以着手格式化了。

3 Java代码中的日期时间格式化

3.1 java.text.SimpleDateFormat extends java.text.DateFormat

作用:通过实例的format()方法将日期对象( java.util.Date )格式化为文本,通过 parse() 方法将文本解析为日期对象( java.util.Date )

注意:在通过SimpleDateFormat sdf = new SimpleDateFormat()实例化时,会以当前的默认时区作为后续格式化、解析操作的时区,即使后续代码中重新设置默认时区也不会影响 SimpleDateFormat实例 的时区值。

1
2
3
4
5
6
7
// 初始化时设置 日期和时间模式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");

// 修改日期和时间模式
sdf.applyPattern("yyyy/MM/dd HH:mm:ss.SSS")

sdf.format(new Date());

查看源码会发现其实java.text.SimpleDateFormat内部使用了java.util.Calendar来获取java.util.Date实例的时分秒等部分,并进行格式化处理。

3.2 java.text.DateFormat

作用:内置了多种与特定的 DateFormatSymbols对象 绑定的formatter对象(也就是预设了日期时间模式)。

好处:方便对日期时间进行本地化。 缺点:无法直接修改日期时间模式。

其内部是使用java.text.SimpleDateFormat来处理格式化的

3.3 java.util.Calendar

作用:用于萃取日期时间中的年、月、日、时、分、秒等信息,至于格式化就有我们自己解决了。它有一个好处就是在初始Calendar实例时可以设置使用的TimeZone。

1
2
3
4
5
6
Date date = new Date();
Calendar c1 = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
c1.set(date);
cl.get(Calendar.YEAR);
cl.get(Calendar.MONTH);
cl.get(Calendar.DATE);

原文链接:https://cloud.tencent.com/developer/article/1023403?from=15425