gpt4 book ai didi

java - 在 ofEpochMilli 和 ofEpochSecond 之间切换

转载 作者:行者123 更新时间:2023-12-05 07:35:41 24 4
gpt4 key购买 nike

在我的应用程序中,其中一个第三方 API 以纪元返回时间戳。

有时它以秒为单位返回纪元时间,有时以毫秒为单位返回未确认。我的应用程序使用以下代码将它转换为 Java 日期并显示给用户,但是当我收到以毫秒为单位的时间时,它在年份上失败了。

    String time = "1519377196185"; //Time in miliseconds
//String time = "1521575819"; //Time in seconds.
String timeZone = "US/Pacific";
long epochdate = Long.parseLong(time);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy hh:mm a");
LocalDateTime date34 =
Instant.ofEpochSecond(epochdate)
.atZone(ZoneId.of(timeZone))
.toLocalDateTime();
String date = date34.format(formatter).toString();
System.out.println("date : " + date);

如果我使用 Instant.ofEpochMilli(epochdate) 几毫秒,那么它工作正常。所以我的问题是我如何知道即将到来的时间戳以毫秒或秒为单位,所以在此基础上我将在 ofEpochMilliofEpochSecond

之间切换

最佳答案

年份偏移量

我会尝试首先将日期解析为秒,因为如果日期以毫秒为单位,那么年份将非常大(在本例中为 50000),然后如果年份不大于年份定义的偏移量(例如3000),则返回该日期,否则返回以毫秒为单位的日期。

public ZonedDateTime getZonedDateTime(String time) {
long longTime = Long.parseLong(time), yearOffset = 3000L;
String timeZone = "US/Pacific";
ZoneId zoneId = ZoneId.of(timeZone);
ZonedDateTime zdt = Instant.ofEpochSecond(longTime).atZone(zoneId);
if (zdt.getLong(ChronoField.YEAR_OF_ERA) >= yearOffset) {
return Instant.ofEpochMilli(longTime).atZone(zoneId);
} else {
return zdt;
}
}

使用函数打印:

getZonedDateTime("1519377196185"); // 2018-02-23T01:13:16.185-08:00[US/Pacific]
getZonedDateTime("1521575819"); // 2018-03-20T12:56:59-07:00[US/Pacific]

误差范围

您决定使用的任何方法都可能会出错并且日期转换不正确,特别是当日期以毫秒为单位并且太接近纪元 1970-01-01T00:00 时:00Z.

使用 3000 的年份偏移量的边距误差为:

  • 当日期最初以毫秒为单位,范围从1970-01-01T00:00:00Z1971-01-12T04:48:00Z
    • 将被视为以秒为单位的日期
  • 当日期最初以为单位并且日期等于或晚于3000-01-01T00:00:00Z时(普通应用中的日期不太可能)
    • 将被视为以毫秒为单位的日期

计算毫秒日期的误差范围

您可以使用以下方法计算最初以毫秒为单位的日期的误差范围:

Instant.ofEpochMilli(LocalDateTime.of(3000, 1, 1, 0, 0) // year = 3000
.toEpochSecond(ZoneOffset.UTC)); // 1971-01-12T04:48:00Z

关于java - 在 ofEpochMilli 和 ofEpochSecond 之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49394698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com