java .time
Я рекомендую вам использовать java .time, современный Java API даты и времени, для работы с датой и временем.
@Test
void doesNotFallBackToMinus8InNovember2020() {
ZoneId whitehorse = ZoneId.of("America/Whitehorse");
ZoneOffset offsetAtAbsentTransition
= LocalDateTime.of(2020, Month.NOVEMBER, 1, 1, 0)
.atZone(whitehorse)
.withLaterOffsetAtOverlap()
.getOffset();
assertEquals(ZoneOffset.ofHours(-7), offsetAtAbsentTransition);
}
То же самое для America / Dawson.
На моем JUnit 5 тест не проходит:
org.opentest4j.AssertionFailedError: expected: <-07:00> but was: <-08:00>
at org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:55)
at org.junit.jupiter.api.AssertEquals.failNotEqual(AssertEquals.java:195)
at org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:184)
at org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:179)
at org.junit.jupiter.api.Assertions.assertEquals(Assertions.java:1124)
(many more lines)
Это потому, что у меня нет последнего обновления в базу данных часовых поясов.
Мой Java ошибочно «думает», что часы переведены с 2 утра на 1 ночи 1 ноября. Это ошибка, которую вы хотите, чтобы тест обнаружил. Таким образом, настенные часы будут показывать 01:00 дважды, один раз со смещением -07: 00 (правильно) и один раз со смещением -08: 00 (неправильно). Чтобы поймать не тот, нужно использовать withLaterOffsetAtOverlap()
. При обновленной установке Java этот вызов не будет иметь никакого значения, потому что не будет никакого перекрытия.
Изменить: вы, конечно, также можете выбрать дату в середине зимы, а не точное время когда переход не должен произойти. Я бы, наверное, сделал и то, и другое, на всякий случай.
Edit 2:
Мне нужен приведенный выше код в java 7. как мы можем написать то же самое в java 7
Вы используете ThreeTen Backport, этот бэкпорт java .time, современного Java API даты и времени, для Java 6 и 7. Затем вы просто используете точно такой же код. . Смотрите ссылки внизу для backport. Вам не нужно обновлять производственный код до java .time (даже если это будет иметь преимущества), чтобы использовать java .time в (одном из) ваших модульных тестов.
Как вы сказали, после обновления до базы данных нового часового пояса оператор assert работает ??
Должен. Я не пробовал себя, но это была идея.
Вопрос: Как использовать бэкпорт java .time с Java 7?
java .time just требуется как минимум Java 6 .
- В Java 8 и более поздних версиях и на более новых устройствах Android (начиная с уровня API 26) современный API встроен .
- В не- Android Java 6 и 7 получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
- На (более ранней) Android используйте Android версию ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
с подпакетами.
Редактировать 3: Joda-Time
Я хочу использовать время joda вместо java .time, но я изо всех сил пытаюсь получить getoffset, как вы написали в коде. Не могли бы вы сказать мне, что тот же код в joda time
Я действительно не вижу веских причин, почему вы должны использовать Joda-Time для этого, когда вы можете использовать ThreeTen Backport и, следовательно, java. time, преемник Joda-Time. На домашней странице Joda-Time:
Обратите внимание, что с Java SE 8 и далее пользователям предлагается перейти на java.time
(JSR-310) - основную часть JDK, которая заменяет этот проект.
Я знаю, что вы используете Java 7; но если вы добавляете к своим тестам внешнюю зависимость, почему бы не добавить самую лучшую и самую современную из возможных?
В любом случае, вот эквивалентный тест JUnit 4 для Joda-Time:
@Test
public void test() {
DateTimeZone timezone = DateTimeZone.forID("America/Whitehorse");
Instant dt = new DateTime(2020, 11, 1, 1, 0, timezone)
.withLaterOffsetAtOverlap()
.toInstant();
long offsetInMilliseconds = timezone.getOffset(dt.getMillis());
assertEquals(TimeUnit.HOURS.toMillis(-7), offsetInMilliseconds);
}
Опять же, в Joda-Time 2.9.9 и Java 7 происходит сбой:
java.lang.AssertionError: expected:<-25200000> but was:<-28800000>
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.failNotEquals(Assert.java:834)
(etc.)
Вы заметили, что сообщение об ошибке включает в себя несколько более сложные значения миллисекунд. чтобы прочитать смещения, указанные в сообщении об ошибке из теста java .time выше.
Я не эксперт Joda-Time, но, если я правильно понял, Joda-Time хранит свою собственную копию база данных часовых поясов. Таким образом, обновление вашей Java установки - не лучший способ пройти тест. Вместо этого вам нужно обновить Joda-Time. Инструкции находятся на веб-сайте Joda-Time, см. Ссылку внизу.
Ссылки