首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为9999年12月31日创建java.sql.Date的最简单方法?

为9999年12月31日创建java.sql.Date的最简单方法?
EN

Stack Overflow用户
提问于 2018-10-20 03:37:48
回答 3查看 1.6K关注 0票数 2

我想为9999年12月31日(协调世界时)创建一个java.sql.Date。目前我使用的是:

代码语言:javascript
复制
Date eot = new Date(new GregorianCalendar(9999, Calendar.DECEMBER, 31).getTimeInMillis());

然而,它给我的印象是丑陋的。有没有更简单的方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-20 06:30:44

为什么不直接使用常量呢?

代码语言:javascript
复制
Date eot = new Date(253402214400000L);

另请注意,docs显示8099-12-31是支持的最新日期。那应该是193444070400000L。虽然在测试中,它似乎可以与9999-12-31很好地协同工作。

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

票数 4
EN

Stack Overflow用户

发布于 2018-10-20 05:06:07

使用Java的新LocalDate类。如果必须使用java.sql.Date,可以使用valueOf()对其进行转换

代码语言:javascript
复制
Date eot = Date.valueOf(LocalDate.of(9999, Month.DECEMBER, 31));
票数 3
EN

Stack Overflow用户

发布于 2018-10-20 04:52:16

@shmosel的答案不是UTC。而且valueOf真的真的很慢。

每个操作的Constants为7纳米ValueOf为430:

代码语言:javascript
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52898913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档