首页 > 解决方案 > 在不影响时间的情况下减去天数

问题描述

我有以下一段代码。我正试图t在当前时间获得正好 10 天前的纪元值。但是当我使用https://www.epochconverter.com/t转换回日期/时间时,打印结果的时间不正确。我错过了什么?

        long t = LocalDateTime.now()
                .minusDays(10)
                .toEpochSecond(ZoneOffset.UTC) * 1000;


        System.out.println(t);

标签: javadatetime

解决方案


LocalDateTime您当前时区的时间表示也是如此,然后您可以从 UTC 时区的纪元中获取秒数。但这没有做的是将时间转换为 UTC,它保持不变,所以如果是当地时间下午 6 点,这将生成 UTC 下午 6 点的时间。

您需要做的是考虑时区。以下每个语句都将打印相同的值(以秒为单位),当我将它们插入https://www.epochconverter.com时,它们会给出生成它们的正确“本地时间”。

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.TimeZone;

public class Test {

    public static void main(String[] args) {
        TimeZone tz = TimeZone.getDefault();
        ZoneOffset offset = tz.toZoneId().getRules().getStandardOffset(Instant.now());
        long t = LocalDateTime.now()
                .minusDays(10)
                .toEpochSecond(offset);
        System.out.println(t);
        System.out.println(ZonedDateTime.now().minusDays(10).toEpochSecond());
        System.out.println(OffsetDateTime.now(ZoneOffset.UTC).minusDays(10).toEpochSecond());
    }
}

可能还有更多方法可以做到这一点,但这些是我的基本方法。

因此,例如,我得到了一个输出,1631350948当我将它插入转换器时,它打印了

格林威治标准时间:2021 年 9 月 11 日星期六上午 9:02:28
您的时区:2021 年 9 月 11 日星期六晚上 7:02:28 格林威治标准时间+10:00
相对时间:10 天前

当我对输出进行采样时,“本地时间”是正确的


推荐阅读