假设我的System.currentTimeMillis()
值为long
。
如何修改它以匹配最后一分钟开始的瞬间?即,零秒和毫秒。
我宁愿不使用魔术常数。使用java.time
很好。
答案 0 :(得分:5)
我同意推荐java.time
的答案,但在这些答案中可以做得更简单:
long lastWholeMinute = Instant.now().truncatedTo(ChronoUnit.MINUTES).toEpochMilli();
这只是给了1517940060000
。当然,如果保留Instant
对象是有意义的,那么一定要做到这一点,而不是转换为裸基元long
。
如果您的long
值是您存储的值而不是现在的时间,那么它非常相似:
long someEpochMilliValue = 1_517_941_234_567L;
long lastWholeMinute = Instant.ofEpochMilli(someEpochMilliValue)
.truncatedTo(ChronoUnit.MINUTES)
.toEpochMilli();
答案 1 :(得分:3)
使用java.time
可能 最简单方式。您可以使用withNano
和withSecond
,例如
java.time.ZonedDateTime zdt = java.time.ZonedDateTime.now().withNano(0).withSecond(0);
long millis = zdt.toInstant().toEpochMilli();
答案 2 :(得分:1)
由于该值以毫秒为单位, 如果 我们假设理想化的一天(没有闰秒等),那么给定l
你可以做到只需从中删除l % 60000L
的值即可。我意识到这是一个神奇的常数,但它确实是一个常数,一分钟总有60,000毫秒。我给它起象征性的名字:
private static long SIXTY_SECONDS_IN_MS = 60000L;
并不担心。那就是:
long l = /*...your number...*/;
l = l - (l % SIXTY_SECONDS_IN_MS);
为什么会这样:Epoch值是从1970年1月1日午夜开始,所以在0L,60000L,120000L等处,理想化日基于该值的秒和毫秒为0.所以我们使用余数运算符(%
)隔离如果我们除以60000L将保留的值的一部分并将其删除。因此,再次假定理想化天数的结果值对于秒和毫秒具有0。如果我们假设所有时区都将在UTC的全分钟偏移量,它也适用于时区。我只听说过时区的倍数是半小时或半小时偏离UTC(“格林威治标准时间加5小时”,“格林威治标准时间加上5.5小时”),从来没有(比方说)“GMT加5小时7分20秒”。 (实际上,timezome偏移的标准符号,+0600
或类似,仅包括小时和分钟,而不是小数分钟。)
import java.time.*;
public class Example
{
private static long SIXTY_SECONDS_IN_MS = 60000L;
public static void main (String[] args) throws java.lang.Exception
{
long l = System.currentTimeMillis();
l = l - (l % SIXTY_SECONDS_IN_MS);
System.out.println("l = " + l);
// Checking the result
LocalDateTime dt = Instant.ofEpochMilli(l).atZone(ZoneId.systemDefault()).toLocalDateTime();
System.out.println(dt);
System.out.println(dt.getSecond()); // 0
System.out.println(dt.getNano()); // 0
}
}
但是,如果这个常数违反了问题的条款,你认为我不应该回答,请告诉我,我会删除答案。 : - )