我得到了错误的时间戳记
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
答案 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?