创建9999年12月31日(UTC)的java.sql.Date的最简单方法?

时间:2018-10-19 19:37:48

标签: java date

我想为9999年12月31日(UTC)创建一个java.sql.Date。目前我正在使用此:

Date eot = new Date(new GregorianCalendar(9999, Calendar.DECEMBER, 31).getTimeInMillis());

但是,它让我印象深刻。有没有更简单的方法?

3 个答案:

答案 0 :(得分:3)

使用Java的新CodeFile类。如果必须具有LocalDate,则可以使用java.sql.Date进行转换:

valueOf()

答案 1 :(得分:3)

为什么不只使用常量?

Date eot = new Date(253402214400000L);

还请注意,docs8099-12-31是支持的最新日期。那将是193444070400000L。尽管在测试中,它似乎可以与9999-12-31一起正常工作。

此外,我只是指出您可能应该避免使用此API,而应使用java.time API。

答案 2 :(得分:1)

@shmosel的答案不是UTC。而且valueOf确实非常慢。

Constants是7纳米ValueOf是430个每次操作:

Benchmark                  Mode  Cnt    Score     Error  Units
DataTimeUtilsJmh.constants avgt    5    6.929 ±   3.166  ns/op
DataTimeUtilsJmh.valueOf    avgt    5  429.592 ± 211.741  ns/op




public static final LocalDate MAX_ORACLE_DATE_AS_LOCAL_DATE = LocalDate.of(9999, Month.DECEMBER, Month.DECEMBER,Month.DECEMBER.maxLength());

public static final LocalDateTime START_OF_DAY_ON_MAX_ORACLE_DATE_AS_LOCAL_DATE_TIME = MAX_ORACLE_DATE_AS_LOCAL_DATE
    .atStartOfDay();

public static final Instant UTC_START_OF_DAY_ON_MAX_ORACLE_DATE_AS_INSTANT = START_OF_DAY_ON_MAX_ORACLE_DATE_AS_LOCAL_DATE_TIME
    .toInstant(ZoneOffset.UTC);

public static final long UTC_START_OF_DAY_ON_MAX_ORACLE_DATE_AS_EPOC_MILLIS = UTC_START_OF_DAY_ON_MAX_ORACLE_DATE_AS_INSTANT
    .toEpochMilli();

@Test
public void test() {

    final java.sql.Date utcStartOfDayMaxOracleDateAsSqlDate = new java.sql.Date(
            UTC_START_OF_DAY_ON_MAX_ORACLE_DATE_AS_EPOC_MILLIS);

    final long time = utcStartOfDayMaxOracleDateAsSqlDate.getTime();

    final Instant ofEpochMilli = Instant.ofEpochMilli(time);

    final OffsetDateTime atOffset = ofEpochMilli.atOffset(ZoneOffset.UTC);

    final LocalDate actual = atOffset.toLocalDate();

    assertEquals(MAX_ORACLE_DATE_AS_LOCAL_DATE, actual);
}