首先需要明确一件事情 Java 中的 Date 是没有时区概念的,其内部保存的是 Unix 格式的毫秒时间戳,如: 1576323900000
,所以在 Date 与 字符串的解析和格式化中要时刻注意当前的默认时区。
设置运行环境时区
import java.util.TimeZone;
// TimeZone.getAvailableIDs(); 可以获取所有支持的时区
// 参看:https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
解析
引入库:
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
Date 解析是一个稍微麻烦一点的事情,推荐十分好用的一个类 FastDateFormat 。
FastDateFormat is a fast and thread-safe version of
SimpleDateFormat
.
String dateStr = "2019-12-14T11:45:00Z";
String pattern = "yyyy-MM-dd'T'HH:mm:ssZZ";
Date date = FastDateFormat.getInstance(pattern).parse(dateStr);
System.out.println(DateFormatUtils.ISO_8601_EXTENDED_DATETIME_TIME_ZONE_FORMAT.format(date));
格式化
这里有一个非常简单和好用的类推荐给大家 DateFormatUtils ,他拓展于刚刚解析的类 FastDateFormat 。
这个类支持从 Date 和 Calendar 输出为指定格式的字符串,讲一个我比较推崇的日期字符串 Pattern:yyyy-MM-dd'T'HH:mm:ssZZ
这是一个 ISO 8601 标准的包含日期时间时区的字符串,最后形如: 2019-12-14T19:45:00+08:00
。
import org.apache.commons.lang3.time.DateFormatUtils;
import java.util.Date;
DateFormatUtils.ISO_8601_EXTENDED_DATETIME_TIME_ZONE_FORMAT.format(new Date);