Java 毫秒时间,每小时分辨率

Java millis time with hourly resolution

如何在忽略分钟和秒的情况下获得 java UTC 时间毫秒。

例如: 如果是 2019 年 10 月 10 日 1:10:59 AM ,它应该得到 Time 或毫秒 2019 年 10 月 10 日凌晨 1 点。

您可以使用 LocalDate#atTime:

LocalDate.now().atTime(LocalDateTime.now().getHour(), 0, 0);

这将为您提供当前日期,小时、分钟和秒设置为 0。

并获取 UTC 毫秒数:

LocalDate.now().atTime(LocalDateTime.now().getHour(), 0, 0).toInstant(ZoneOffset.UTC).toEpochMilli();

Jon Skeet 注意到,调用 now 可能会在极端情况下产生意想不到的结果。可以肯定的是,我们可以调用它一次,然后将其转换为 LocalDate 解决方案:

var currentTime = LocalDateTime.now();
var currentDate = currentTime.toLocalDate();

或者反过来 - 先获取 LocalDate 然后使用 LocalDate#atStartOfDay.

鉴于您对 UTC 毫秒感兴趣,并且每小时有整数毫秒,您可以通过简单的算术计算得出。对于大多数日历计算,我真的不建议这样做,但在这种情况下,我认为这是最简单的方法。像这样:

private static final long MILLISECONDS_PER_HOUR = TimeUnit.HOURS.toMillis(1);

// Injecting a clock makes the method testable. You can use Clock.systemUTC()
// for the system clock.
public static long truncateMillisToHour(Clock clock) {
    long millisSinceEpoch = clock.millis();
    // Truncate to the nearest hour
    long hoursSinceEpoch = millisSinceEpoch / MILLISECONDS_PER_HOUR;
    // Then multiply up again
    return hoursSinceEpoch * MILLISECONDS_PER_HOUR;
}  

请注意,如果时钟指向纪元之前,这会将向上四舍五入到最接近的小时,但是如果您拿正版的"current time"那应该不是问题吧

(我在看到 Ole V.V 之前写了这个答案。truncatedTo 的回答是一个非常好的方法。)

总结:

Instant
.now()
.truncatedTo( 
    ChronoUnit.HOURS 
)
.toEpochMilli()

1570600800000


java.time,现代的 Java 日期和时间 API 有你需要的方法:许多 类 有一个 truncatedTo 方法满足您的需求。

    Instant now = Instant.now();
    System.out.println("Rough milliseconds:                        " + now.toEpochMilli());
    Instant currentWholeHour = now.truncatedTo(ChronoUnit.HOURS);
    System.out.println("Milliseconds ignoring minutes and seconds: "
            + currentWholeHour.toEpochMilli());

当 运行 这个片段刚才的输出是:

Rough milliseconds:                        1570604053787
Milliseconds ignoring minutes and seconds: 1570600800000

我很清楚第一行是你要求不是的。我只是为了让您看到其中的不同而包含它。

截断发生在 UTC 中。如果您所在的时区与 UTC 的时差不是整数小时,则结果可能与您预期的不同。此类时区的示例包括 Asia/Kathmandu、America/St_Johns 某些年份还 Australia/Lord_Howe.

Link: Oracle tutorial: Date Time