我想为9999年12月31日(协调世界时)创建一个java.sql.Date。目前我使用的是:
Date eot = new Date(new GregorianCalendar(9999, Calendar.DECEMBER, 31).getTimeInMillis());
然而,它给我的印象是丑陋的。有没有更简单的方法?
发布于 2018-10-20 06:30:44
发布于 2018-10-20 05:06:07
使用Java的新LocalDate
类。如果必须使用java.sql.Date
,可以使用valueOf()
对其进行转换
Date eot = Date.valueOf(LocalDate.of(9999, Month.DECEMBER, 31));
发布于 2018-10-20 04:52:16
@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);
}
https://stackoverflow.com/questions/52898913
复制相似问题