tl;博士
Instant.now().toString()
2020-03-08T00:21:48.647951Z
java.util.Date::toString 撒谎
您对GregorianCalendar::getTime 的调用会返回java.util.Date。从这个方法和类命名中可以看出,这些类的设计很糟糕。
然后您隐式调用Date::toString 以生成表示该对象内值的文本。该值实际上是 UTC,仅是自 UTC 1970 年第一刻的纪元参考以来的毫秒数。不幸的是,该方法在生成文本时动态应用 JVM 当前的默认时区。这会产生该区域包含在对象内的错觉。
令人困惑?是的。 从不使用这些旧的日期时间类的众多原因之一。请改用 java.time 类。
java.time
其他答案是正确的,但现在已过时。可怕的 Date、Calendar、GregorianCalendar 和 SimpleDateFormat 类在几年前被 JSR 310 中定义的现代 java.time 类所取代。
要获取 UTC 中的当前时刻,请使用 Instant。根据定义,java.time 中的这个基本构建块类始终采用 UTC。
Instant instant = Instant.now() ;
通过调用toString 以ISO 8601 格式生成标准字符串。
String output = instant.toString() ;
看到这个code run live at IdeOne.com。
2020-03-08T00:21:48.647951Z
要在生成字符串时更灵活地格式化,请使用OffsetDateTime 类。搜索 Stack Overflow 以了解 DateTimeFormatter。
OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;