从System.currentTimeMillis值剥离秒和毫秒

时间:2018-02-06 17:10:40

标签: java time

假设我的System.currentTimeMillis()值为long

如何修改它以匹配最后一分钟开始的瞬间?即,零秒和毫秒。

我宁愿不使用魔术常数。使用java.time很好。

3 个答案:

答案 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 可能 最简单方式。您可以使用withNanowithSecond,例如

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或类似,仅包括小时和分钟,而不是小数分钟。)

Live Example

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
    }
}

但是,如果这个常数违反了问题的条款,你认为我不应该回答,请告诉我,我会删除答案。 : - )