从System.currentTimeMillis值剥离秒和毫秒

问题描述 投票:3回答:3

假设我有一个System.currentTimeMillis()值作为long数。

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

我宁愿不使用魔法常量。使用java.time很好。

java time
3个回答
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();

3
投票

使用java.time可能是最简单的方法。你可以使用withNanowithSecond

java.time.ZonedDateTime zdt = java.time.ZonedDateTime.now().withNano(0).withSecond(0);
long millis = zdt.toInstant().toEpochMilli();

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

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

© www.soinside.com 2019 - 2024. All rights reserved.