最近群里有小伙伴问到这个问题,这边正好遇到过,记录一下。
这里最后边的“
Z
”是协调世界时中0时区
的标志。协调世界时,即UTC
,又称世界统一时间、世界标准时间、国际协调时间。
如果时间是以协调世界时(UTC
)表示,则在时间后面直接加上一个“Z
”。因此,“09:30 UTC”就写作“09:30Z”或是“0930Z”
而我们所在地方(中国大陆)使用的是东八区的时间,比0时区早了8小时。
下面介绍几种处理这种带时区的字符串变成我们熟悉的:
public class DateTimeTest {
public static void main(String[] args) throws ParseException {
final DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 设定一个0时区2月9号16点的时间字符串
String date = "2020-03-09T16:00:00.19Z";
// 第一种方法
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");
Date d = format.parse(date.replace("Z", " UTC"));
System.out.println(df.format(d)); // 2020-03-10 00:00:00
// 第二种方法,直接用Java8的Instant
Instant instant = Instant.parse(date);
// System.out.println(LocalDateTime.ofInstant(instant, ZoneId.systemDefault()));
long time = instant.toEpochMilli();
Date dateTime = new Date(time);
System.out.println(df.format(dateTime)); // 2020-03-10 00:00:00
// 第三种,其实这种和第一种差不多
SimpleDateFormat fmt = new SimpleDateFormat(
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(fmt.parse(date));
// 第三种,使用joda time
Date jtd = ISODateTimeFormat.dateTime().parseDateTime(date).toDate();
System.out.println(jtd);
}
}
Output:
2020-03-10 00:00:00
2020-03-10 00:00:00
Tue Mar 10 00:00:00 CST 2020
Tue Mar 10 00:00:00 CST 2020
我们看到0时区9号16点的已经变成我们我们熟悉的东八区时间了。