如何从LocalDate和LocalDateTime中提取纪元?

88 time epoch java-8 java-time

如何LongLocalDateTime或的实例中提取纪元值LocalDate?我尝试了以下内容,但它给了我其他结果:

LocalDateTime time = LocalDateTime.parse("04.02.2014  19:51:01", DateTimeFormatter.ofPattern("dd.MM.yyyy  HH:mm:ss"));
System.out.println(time.getLong(ChronoField.SECOND_OF_DAY)); // gives 71461
System.out.println(time.getLong(ChronoField.EPOCH_DAY)); // gives 16105
Run Code Online (Sandbox Code Playgroud)

我想要的只是1391539861本地日期时间的值"04.02.2014 19:51:01".我的时区是Europe/OsloUTC + 1,夏令时.

nos*_*sid 128

这些类LocalDateLocalDateTime不包含有关的信息时区偏移时间纪元以来,几秒钟就没有这个信息ambigious.但是,对象有几种方法可以通过传递ZoneId实例将它们转换为带时区的日期/时间对象.

LOCALDATE的

LocalDate date = ...;
ZoneId zoneId = ZoneId.systemDefault(); // or: ZoneId.of("Europe/Oslo");
long epoch = date.atStartOfDay(zoneId).toEpochSecond();
Run Code Online (Sandbox Code Playgroud)

LocalDateTime

LocalDateTime time = ...;
ZoneId zoneId = ZoneId.systemDefault(); // or: ZoneId.of("Europe/Oslo");
long epoch = time.atZone(zoneId).toEpochSecond();
Run Code Online (Sandbox Code Playgroud)

  • 对于UTC情况,或者您已经知道时区的地方,一种更简单的方法是`long epoch = time.toEpochSecond(ZoneOffset.UTC)`,或者如果需要,可以使用`long epoch = time.toEpochSecond(ZoneId.systemDefault());”。走那条路。 (6认同)
  • 没关系。找到它:`ZoneId.ofOffset("UTC", ZoneOffset.ofHours(0))` (3认同)
  • 是否可以避免使用 ZoneId,或使用自定义的、恒定的 ZoneId 实例(+0,表示 GMT)?我问这个是因为我希望所有计算都标准化。另外,我该如何做相反的事情:从纪元时间转换为 LocalDate/LocalDateTime(也没有 ZoneId,或使用 GMT 时间)? (2认同)

Wer*_*sch 24

'自从unix epoch以来的Millis'代表了一个瞬间,所以你应该使用Instant类:

private long toEpochMilli(LocalDateTime localDateTime)
{
  return localDateTime.atZone(ZoneId.systemDefault())
    .toInstant().toEpochMilli();
}
Run Code Online (Sandbox Code Playgroud)

  • 使用 `ZoneId.systemDefault()` 是不正确的,因为 unix 纪元指的是 UTC (2认同)
  • `ZoneId.systemDefault()` 似乎返回 UTC,所以 systemDefault 应该没问题 (2认同)

Jod*_*hen 9

您需要的转换需要UTC/Greewich或时区的偏移量.

如果你有一个偏移,有一个专门的方法LocalDateTime此任务:

long epochSec = localDateTime.toEpochSecond(zoneOffset);
Run Code Online (Sandbox Code Playgroud)

如果你只有一个,ZoneId那么你可以ZoneOffsetZoneId:

ZoneOffset zoneOffset = ZoneId.of("Europe/Oslo").getRules().getOffset(ldt);
Run Code Online (Sandbox Code Playgroud)

但您可以通过ZonedDateTime更简单的方式找到转换:

long epochSec = ldt.atZone(zoneId).toEpochSecond();
Run Code Online (Sandbox Code Playgroud)

  • 如果你只关心UTC,那就是`long epochSec = localDateTime.toEpochSecond(ZoneOffset.UTC);` (4认同)