Java中Date类型和UTC时间的相互转换
关于UTC之前有了一篇文章,最近处理了些时间相关的业务,所以本文记录下一些常用的转换方式
References:
- https://stackoverflow.com/questions/28616835/how-to-format-date-using-simpledateformat
- https://stackoverflow.com/questions/308683/how-can-i-get-the-current-date-and-time-in-utc-or-gmt-in-java
关于UTC和Date什么的就不说了,这里直接贴几个常用的转换方法:
- UTC格式时间转java.util.Date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date strDate;
try {
strDate = sdf.parse(item.getDate());
} catch (Exception e) {
strDate = null;
}
这里需要注意的就是T这个字符的转义,由于T是个特殊的字符,所以不能像普通字符那样写在pattern里,也不能用\转义,都会导致无法解析,这里需要用两个英文单引号
- java.util.Date转UTC格式时间
由于Date不保存时区信息,记录的是1970至今的毫秒数,所以直接调用Date.toString()方法获得的就是UTC时间(GMT)。需要格式化展示的可以用如下方法:
public static String toISO8601UTC(Date date) {
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
df.setTimeZone(tz);
return df.format(date);
}
\>\> update20210207 Java8中的时间处理用DateTimeFormatter
更方便
/**
* 返回指定偏移量的ISO格式时间字符串:
* 2021-01-25T15:11:56.778+08:00
* @param seconds 当前时间增加秒数
* @return 偏移后时间的字符串
*/
public static String getOffsetISOTime(long seconds) {
OffsetDateTime offsetDateTime = OffsetDateTime.now().plusSeconds(seconds);
return DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(offsetDateTime);
}
/**
* 返回当前时间ISO格式字符串:
* 2021-01-25T15:11:56.778+08:00
* @return 当前时间的字符串
*/
public static String getCurrentISOTime() {
ZonedDateTime now = ZonedDateTime.now();
return DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(now);
}
DateTimeFormatter的一些格式如下
ZonedDateTime now = ZonedDateTime.now();
DateTimeFormatter.ISO_DATE_TIME.format(now); // 2021-02-07T14:05:24.847499+08:00[Asia/Shanghai]
DateTimeFormatter.ISO_ZONED_DATE_TIME.format(now); // 2021-02-07T14:05:24.847499+08:00[Asia/Shanghai]
DateTimeFormatter.BASIC_ISO_DATE.format(now); // 20210207+0800
DateTimeFormatter.ISO_INSTANT.format(now); // 2021-02-07T06:05:24.847499Z
DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(now); // 2021-02-07T14:05:24.847499
DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(now); // 2021-02-07T14:05:44.8464995+08:00
DateTimeFormatter.RFC_1123_DATE_TIME.format(now); // Sun, 7 Feb 2021 14:05:24 +0800