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.
如何在忽略分钟和秒的情况下获得 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.