【问题标题】:Subtract number of days without impacting the time在不影响时间的情况下减去天数
【发布时间】:2021-09-21 08:51:42
【问题描述】:

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

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


        System.out.println(t);

【问题讨论】:

  • 据我了解,您将当前时区的“本地日期/时间”减去 10 天,然后以 UTC 时区输出。您需要注意的是,这不会将值转换为 UTC,它只会采用“当前时间”并显示为 UTC,因此如果是当地时间下午 6 点,则将是 UTC 时间下午 6 点。相反,您应该使用 ZonedDateTime 或使用当前时区转换纪元秒
  • UTC 10 天前还是您所在时区的 10 天前?在极端情况下,这两个可能不是同一时间点。

标签: java datetime


【解决方案1】:

所以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 GMT+10:00
相对:10 天前

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

【讨论】:

    【解决方案2】:

    我建议您使用OffsetDateTime.now(ZoneOffset.UTC) 获取当前UTC 日期时间,然后从中减去10 天。最后,从生成的OffsetDateTime 中获取纪元秒数。

    import java.time.OffsetDateTime;
    import java.time.ZoneOffset;
    
    public class Main {
        public static void main(String[] args) {
            System.out.println(OffsetDateTime.now(ZoneOffset.UTC).minusDays(10).toEpochSecond());
        }
    }
    

    输出:

    1631350741
    

    ONLINE DEMO

    通过 Trail: Date Time 了解有关 modern Date-Time API* 的更多信息。


    * 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-02
      相关资源
      最近更新 更多