【发布时间】:2019-08-08 15:05:36
【问题描述】:
我有 UTC 日期,我需要创建与 UTC 值完全相同的 Date 对象(遗留原因)。
我已经做到了:
String date = "2012-05-05 12:13:14";
TemporalAccessor formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
.withZone(ZoneId.of("UTC"))
.parse(date);
Instant instant = Instant.from(
formatter
); //
ZonedDateTime zdf = ZonedDateTime.ofInstant(instant,ZoneId.of("UTC"));
Calendar calendar = Calendar.getInstance();
calendar.set(zdf.getYear(),zdf.getMonthValue(),zdf.getDayOfMonth(),zdf.getHour(),zdf.getMinute(),zdf.getSecond());
Date dt = calendar.getTime();
Date d2 = Date.from(instant);
但是,有什么困扰我 -
当我创建日期对象时,它应该在我的 JVM 的默认时区显示日期。但是这里dt 的值与我输入的UTC 日期完全相同,但dt2 在我的默认时区中表示的日期相同,为什么会发生这种情况?为什么一个人没有皈依而另一个人皈依了?
感谢您的解释!
【问题讨论】:
-
A
java.util.Date根本没有时区。自 Unix 纪元以来,它 只是 毫秒数。忽略调用Date.toString()的结果——将值转换为本地时区的事实很烦人:( -
@JonSkeet Date.toString() 即使在调试期间检查变量时也会调用?我以这种方式检查了对象的值
-
@JonSkeet 我尝试打印它并且都打印不同的值,所以一个被转换而另一个不是
-
好吧,
dt被创建为“系统时区的 2012-05-05 12:13:14”,因为您调用了使用系统时区的Calendar.getInstance()。而d2在 UTC 中是 2012-05-05 12:13:14。所以,是的,我对他们在做不同的事情并不感到惊讶,但目前还不清楚你想要做什么。 -
@jejjejd 您现在已经在 Stack Overflow 上提出了至少 21 个问题,并收到了大部分问题的答案。请允许我建议您是时候学会接受答案了。请仔细阅读这几段:What should I do when someone answers my question?这里的许多用户会非常感激。