【问题标题】:Java Date toInstant method return a different date?Java Date toInstant 方法返回不同的日期?
【发布时间】:2020-08-08 08:24:22
【问题描述】:

这是我的测试代码,1111-11-11 到即时方法结果的日期是1111-11-17

jshell> new Date(-789,10,11)
$8 ==> Sat Nov 11 00:00:00 JST 1111

jshell> new Date(-789,10,11).toInstant();
$9 ==> 1111-11-17T15:00:00Z

【问题讨论】:

  • 问题是过去处理日期有各种各样的问题,因为过去奇怪的日历切换。您可能需要考虑使用本世纪或上一世纪的日期。
  • 今年1111有什么让你感兴趣的事情吗?
  • 大部分不同之处在于Instant 使用公历,而Date 使用儒略历来表示这么久以前的日期。你想要哪一个?
  • 您可能知道 3-arg Date 构造函数自 1997 年初以来已被弃用,Date 类早已过时?

标签: java date


【解决方案1】:

我建议您从过时且容易出错的旧日期时间 API 切换到 modern date-time API

import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;

public class Main {
    public static void main(String args[]) {
        OffsetDateTime odt = OffsetDateTime.of(1111, 11, 11, 0, 0, 0, 0, ZoneOffset.UTC);
        Instant instant = odt.toInstant();
        System.out.println(instant);
    }
}

输出:

1111-11-11T00:00:00Z

如何使用旧的日期时间 API:

请注意,1582-10-15 之前的日期按儒略历处理。查看https://docs.oracle.com/javase/7/docs/api/java/util/GregorianCalendar.html 了解更多详情。还请检查https://stackoverflow.com/a/23460471/10819573,我提到了编写以下代码:

import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class Main {
    public static void main(String args[]) throws ParseException {
        GregorianCalendar proleptic = new GregorianCalendar();
        proleptic.clear();
        proleptic.setGregorianChange(new Date(Long.MIN_VALUE));
        proleptic.set(Calendar.DAY_OF_MONTH, 11);
        proleptic.set(Calendar.MONTH, Calendar.NOVEMBER);
        proleptic.set(Calendar.YEAR, 1111);
        System.out.println(proleptic.toInstant());
    }
}

输出:

1111-11-11T00:00:00Z

【讨论】:

    猜你喜欢
    • 2016-01-27
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多