首先需要明确一件事情 Java 中的 Date 是没有时区概念的,其内部保存的是 Unix 格式的毫秒时间戳,如: 1576323900000 ,所以在 Date 与 字符串的解析和格式化中要时刻注意当前的默认时区。

设置运行环境时区

  1. import java.util.TimeZone;
  2. // TimeZone.getAvailableIDs(); 可以获取所有支持的时区
  3. // 参看:https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
  4. TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));

解析

引入库:

  1. <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
  2. <dependency>
  3. <groupId>org.apache.commons</groupId>
  4. <artifactId>commons-lang3</artifactId>
  5. </dependency>

Date 解析是一个稍微麻烦一点的事情,推荐十分好用的一个类 FastDateFormat

FastDateFormat is a fast and thread-safe version of SimpleDateFormat.

  1. String dateStr = "2019-12-14T11:45:00Z";
  2. String pattern = "yyyy-MM-dd'T'HH:mm:ssZZ";
  3. Date date = FastDateFormat.getInstance(pattern).parse(dateStr);
  4. 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

  1. import org.apache.commons.lang3.time.DateFormatUtils;
  2. import java.util.Date;
  3. DateFormatUtils.ISO_8601_EXTENDED_DATETIME_TIME_ZONE_FORMAT.format(new Date);