Дата: метод getDisplayName добавляет точечный символ в dayOfWeek только в CI

Вызов localDate.getDayOfWeek().getDisplayName в моем UnitTest, работающем на CircleCI, возвращает другое значение по сравнению с локальным запуском UnitTest.

Вот упрощенный пример кода:

LocalDate localDate = LocalDate.of(2019, 12, 20);
String dayOfWeek = localDate.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.GERMANY);

assertEquals("Fr", dayOfWeek); // actual = "Fr."

dayOfWeek содержит '.' только на CI, но я не понимаю, почему и как это исправить (правильно).

Это журнал ошибок UnitTest:

junit.framework.ComparisonFailure: expected:<Fr[.]> but was:<Fr[]>
..

Подсказка: я использую ThreeTen Android Backport.

ОБНОВЛЕНИЕ Как упомянули @OleV.V. и @Arvind Kumar Avinash, причиной различного поведения (локального и CI) является разница в версиях JDK (локальный 8.x и CI 11.x) .

Это оставляет часть моего вопроса открытым: как это исправить правильно? Это правильный/единственный способ изменить версию JDK в моем образе докера CI?


person goemic    schedule 09.12.2020    source источник
comment
goemic - Есть обновления?   -  person Arvind Kumar Avinash    schedule 09.12.2020
comment
Отвечает ли это на ваш вопрос? JDK dateformatter анализирует DayOfWeek в немецкой локали, java8 против java9< /а>. Это?   -  person Ole V.V.    schedule 10.12.2020
comment
Работает ли ThreeTenABP на CircleCI? Просто любопытно.   -  person Ole V.V.    schedule 10.12.2020
comment
@ОлеВ.В. Я почти уверен, что это неправильное поведение связано с разными версиями Java (локальной и CI), но это не отвечает на мой вопрос о том, как правильно это исправить.   -  person goemic    schedule 10.12.2020


Ответы (1)


Обновлять:

Изучив обновленный вопрос, проблема, похоже, связана с отсутствием библиотеки ThreeTen Android Backport на машина, на которой работает CircleCI. В отсутствие этой библиотеки, вероятно, по умолчанию используется java.time, когда код перекомпилируется на этой машине. Вы должны проверить несколько вещей на этой машине:

  1. Если библиотека была успешно импортирована.
  2. Если есть какие-либо настройки для автоматического импорта наиболее подходящих типов, если некоторые типы отсутствуют.
  3. Если версия JDK совпадает с версией вашего локального компьютера.

Оригинальный ответ:

Вы можете использовать TextStyle.SHORT_STANDALONE

import java.util.Locale;

import org.threeten.bp.LocalDate;
import org.threeten.bp.format.TextStyle;

class Main {
    public static void main(String[] args) {
        LocalDate localDate = LocalDate.of(2019, 12, 20);
        String dayOfWeek = localDate.getDayOfWeek().getDisplayName(TextStyle.SHORT_STANDALONE, Locale.GERMAN);
        System.out.println(dayOfWeek);
    }
}

Вывод:

Fr

Однако я не получаю точку в выводе для TextStyle.SHORT в моей системе. Тем не менее, если вы все еще хотите использовать TextStyle.SHORT и не иметь с ним точки (или любого знака препинания), вы можете заменить каждый знак препинания пустой строкой.

import java.util.Locale;

import org.threeten.bp.LocalDate;
import org.threeten.bp.format.TextStyle;

class Main {
    public static void main(String[] args) {
        LocalDate localDate = LocalDate.of(2019, 12, 20);
        String dayOfWeek = localDate.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.GERMANY);
        System.out.println(dayOfWeek);

        // Remove all punctuation mark
        dayOfWeek = dayOfWeek.replaceAll("\\p{Punct}", "");
        System.out.println(dayOfWeek);
    }
}

Вывод:

Fr
Fr

Примечание. Результат для TextStyle.SHORT меняется с java.time API, как показано ниже:

import java.time.LocalDate;
import java.time.format.TextStyle;
import java.util.Locale;

class Main {
    public static void main(String[] args) {
        LocalDate localDate = LocalDate.of(2019, 12, 20);

        String dayOfWeek = localDate.getDayOfWeek().getDisplayName(TextStyle.SHORT_STANDALONE, Locale.GERMANY);
        System.out.println(dayOfWeek);

        dayOfWeek = localDate.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.GERMANY);
        System.out.println(dayOfWeek);

        // Remove all punctuation mark
        dayOfWeek = dayOfWeek.replaceAll("\\p{Punct}", "");
        System.out.println(dayOfWeek);
    }
}

Вывод:

Fr
Fr.
Fr
person Arvind Kumar Avinash    schedule 09.12.2020
comment
К сожалению, TextStyle.SHORT_STANDALONE не решает проблему. Я все еще получаю сообщение об ошибке CI: junit.framework.ComparisonFailure: expected:<Fr[.]> but was:<Fr[]> - person goemic; 10.12.2020
comment
@goemic - Глядя на сообщение об ошибке, assertEquals("Fr.", dayOfWeek); пройдет, но затем вы говорите, ...running on CircleCI returns a different value compared to running the UnitTest locally., что удивительно. - person Arvind Kumar Avinash; 10.12.2020
comment
Переход на java.time не вариант (прямо сейчас), потому что мы все еще сталкиваемся с некоторыми проблемами с дешугарингом r8. Замена точек — это «хакерское» исправление, которое я уже делаю, но я ищу реальное исправление, чтобы снова сделать код чистым — и избежать слишком большого количества хаков в проекте;) - person goemic; 10.12.2020
comment
это определенно удивительно, поэтому я разместил этот вопрос: D Я думаю, что это как-то связано с версией jdk, используемой в образе докера CI. - person goemic; 10.12.2020
comment
@goemic - Кстати, я также обновлял ответ в то же время, когда вы публиковали этот комментарий :). Я буду ждать от вас обновления, когда проблема будет решена. Даже если мой ответ вам не подходит, я предлагаю вам опубликовать собственное рабочее решение, которое будет полезно будущим посетителям. - person Arvind Kumar Avinash; 10.12.2020
comment
это действительно связано с версией jdk, но не имеет ничего общего с потенциальным откатом к java.time. ThreeTen Android Backport правильно настроен для модульного теста. - person goemic; 10.12.2020