Самый простой способ создать java.sql.Date на 31 декабря 9999 (UTC)? - PullRequest
0 голосов
/ 19 октября 2018

Я хотел бы создать java.sql.Date на 31 декабря 9999 (UTC).В настоящее время я использую это:

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

Тем не менее, это кажется мне ужасным.Есть ли более простой способ?

Ответы [ 3 ]

0 голосов
/ 20 октября 2018

Используйте новый класс Java LocalDate.Если у вас есть java.sql.Date, вы можете конвертировать его с valueOf():

Date eot = Date.valueOf(LocalDate.of(9999, Month.DECEMBER, 31));
0 голосов
/ 20 октября 2018

Почему бы просто не использовать константу?

Date eot = new Date(253402214400000L);

Также обратите внимание, что документы говорят, что 8099-12-31 - самая последняя поддерживаемая дата.Это было бы 193444070400000L.Хотя в тестировании он, кажется, работает с 9999-12-31 просто отлично.

Кроме того, я просто укажу, что вам, вероятно, следует избегать этого API и использовать вместо него API java.time.

0 голосов
/ 19 октября 2018

@ ответ 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...