Java:时间戳错误

时间:2019-02-26 02:27:54

标签: java

我得到了错误的时间戳记

try {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    LocalDateTime localDateTime =  LocalDateTime.parse("1991-04-14 10:30:00", formatter);
    ZoneId zoneId = ZoneId.systemDefault();
    ZonedDateTime zdt = localDateTime.atZone(zoneId);
    Instant instant = zdt.toInstant();
    System.out.println(instant.toEpochMilli());
} catch (DateTimeParseException e) {
    e.printStackTrace();
}

打印=> 671592600000

但是MYSQL的价值有所不同

SELECT FROM_UNIXTIME(671592600000/1000);

结果是1991-04-14 09:30:00.0000
时区= +8.00

1 个答案:

答案 0 :(得分:1)

您正在混合时区。

您的SQL代码行中的“ UNIXTIME”大概是指Unix Time,该秒以秒为单位,或者自第一个milliseconds开始跟踪epoch reference(或某些粒度) 1970年UTC时刻。 {UTC部分至关重要。

您的Java代码采用了LocalDateTime对象,并将其放置在某个时区(在这里我们不知道)的上下文中。因此,结果当然会有所不同。

您应该已经将该输入字符串放入UTC的上下文中(offset-from-UTC为零)。

LocalDateTime               // Represent a date with a time-of-day. But lacking any concept of time zone or offset-from-UTC, this does *NOT* represent a moment, is *NOT* a point on the timeline.
.parse( 
    "1991-04-14 10:30:00"
    .replace( " " , "T" )   // Replace SPACE in middle with `T` to comply fully with ISO 8601 standard format.
)                           // Returns a `LocalDateTime` object.
.atOffset(                  // Give meaning to the `LocalDateTime` by determining a moment with the context of an offset-from-UTC.
    ZoneOffset.UTC          // A constant for UTC (an offset of zero).
)                           // Returns an `OffsetDateTime` object.
.toInstant()                // Convert from the more flexible `OffsetDateTime` to the basic building-block class of `Instant`. An `Instant` is *always* in UTC, by definition.
.toEpochMilli()             // Returns a `long`, a count of milliseconds since 1970-01-01T00:00:00Z. Beware possible data-loss as any microseconds or nanoseconds will be ignored when counting in milliseconds.

您需要非常清楚地认识到LocalDateTime不会 代表一个时刻,而 时间轴上的一点。当您在4月14日上午10:30说时,可能是在东京,巴黎或蒙特利尔的早晨,所有时刻都不同。没有区域或偏移量的上下文,LocalDateTime就没有真正的意义。参见:What's the difference between Instant and LocalDateTime?