我想为9999年12月31日(UTC)创建一个java.sql.Date。目前我正在使用此:
Date eot = new Date(new GregorianCalendar(9999, Calendar.DECEMBER, 31).getTimeInMillis());
但是,它让我印象深刻。有没有更简单的方法?
答案 0 :(得分:3)
使用Java的新CodeFile
类。如果必须具有LocalDate
,则可以使用java.sql.Date
进行转换:
valueOf()
答案 1 :(得分:3)
为什么不只使用常量?
Date eot = new Date(253402214400000L);
还请注意,docs说8099-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);
}