java - 在不影响时间的情况下减去天数
问题描述
我有以下一段代码。我正试图t
在当前时间获得正好 10 天前的纪元值。但是当我使用https://www.epochconverter.com/t
转换回日期/时间时,打印结果的时间不正确。我错过了什么?
long t = LocalDateTime.now()
.minusDays(10)
.toEpochSecond(ZoneOffset.UTC) * 1000;
System.out.println(t);
解决方案
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 天前
当我对输出进行采样时,“本地时间”是正确的