在Java 8中,我需要一种以ISO 8601格式从GMT日期时间获取本地日期时间(GMT + 1)的方法。
一个简单的示例:客户将此日期时间发送给我(服务器)"2020-01-11T23:00:00.000Z"
当用户从日期选择器中选择2020年1月12日时,客户会将其发送给我。GMT + 1是1月12日,GMT是前一天。
基于上述原因,我知道对于我来说,这个日期不是GMT + 1的2020年1月11日,而是2020年1月12日。
所以我需要这个值 "2020-01-12T00:00:00.000"
准确地说,我不需要用SimpleDateFormat的打印本,但只是隐蔽"2020-01-11T23:00:00.000Z"
到"2020-01-12T00:00:00.000"
一个java.util.Date类领域
谢谢。
问题在于源系统采用了纯日期值,但是在午夜添加了时间,然后将其转换为UTC,但是您想要在中使用纯日期值,java.util.Date
默认情况下会在您的本地时区打印,即JVM的默认时间。区。
因此,您必须解析该字符串,将值恢复为源系统的时区,并将该本地时间视为您自己的JVM的默认时区中的时间。
您可以这样做,显示所有中间类型:
String sourceStr = "2020-01-11T23:00:00.000Z";
ZoneId sourceTimeZone = ZoneOffset.ofHours(1); // Use real zone of source, e.g. ZoneId.of("Europe/Paris");
// Parse Zulu date string as zoned date/time in source time zone
Instant sourceInstant = Instant.parse(sourceStr);
ZonedDateTime sourceZoned = sourceInstant.atZone(sourceTimeZone);
// Convert to util.Date in local time zone
ZonedDateTime localZoned = sourceZoned.withZoneSameLocal(ZoneId.systemDefault());
Instant localInstant = localZoned.toInstant();
Date localDate = Date.from(localInstant); // <== This is your desired result
// Print value in ISO 8601 format
String localStr = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(localDate);
System.out.println(localStr);
输出量
2020-01-12T00:00:00.000
该代码当然可以合并在一起:
String input = "2020-01-11T23:00:00.000Z";
Date date = Date.from(Instant.parse(input).atZone(ZoneOffset.ofHours(1))
.withZoneSameLocal(ZoneId.systemDefault()).toInstant());
System.out.println(date);
输出量
Sun Jan 12 00:00:00 EST 2020
如您所见,即使我位于美国东部时区,日期值也是正确的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句