Получить конкретную дату с использованием DateTimeFormatter

Нет, похоже, что вы делаете это неправильно. Соединения MongoDB являются «клиентской стороной». Очень похоже на то, что вы сказали:

На данный момент я получаю комментарии, соответствующие моим критериям, затем выясняя все uid в этом наборе результатов, получая пользовательские объекты и объединяя их с комментариями. Похоже, я делаю это неправильно.

1) Select from the collection you're interested in.
2) From that collection pull out ID's you need
3) Select from other collections
4) Decorate your original results.

Это не «реальное» соединение, но на самом деле оно намного полезнее, чем соединение SQL, потому что вам не нужно иметь дело с дубликатом строки для «многих» сторонних объединений, вместо этого вы украшаете первоначально выбранный набор.

На этой странице много глупостей и FUD. Оказывается, 5 лет спустя MongoDB все еще есть.

0
задан Jhutan Debnath 17 January 2019 в 14:25
поделиться

2 ответа

Поскольку вы не хотите перечислять все локали в произвольном формате, исправление исключений выглядит лучше. Это может быть пользовательский шаблон или просто выбор другого стиля / постредактирование.

String[] locales = {"en-GB", "es-ES", "zh-CN", "de-DE", "fr-FR", "it-IT",
    "ja-JP", "ko-KR", "ko-KP"};
for (String loc : locales) {
    String[] langCtry = loc.split("-");
    Locale locale = new Locale(langCtry[0], langCtry[1]);
    Locale.setDefault(locale);
    LocalDate.set(2019, 1, 17);
    FormatStyle style = locale.getLanguage().equals("ja") ? FormatStyle.FULL 
                                                          : FormatStyle.LONG;
    DateTimeFormatter.ofLocalizedDate(style);
    String text = format.format(date);
    if (locale.getLanguage().equals("ko")) {
        text = text.replaceFirst("\\s\\S+$", "");
    }
    System.out.printf("%s: %s%n", locale, text);
}

Это исправляет и JA и КО , по-разному.

Может пригодиться набор модульных тестов для проверки ожидаемого, так как данные, зависящие от локали, могут со временем меняться.

0
ответ дан Joop Eggen 17 January 2019 в 14:25
поделиться

Редактировать: CLDR

Запустить подход 2 с параметром командной строки -Djava.locale.providers=CLDR,COMPAT. Например:

java -Djava.locale.providers=CLDR,COMPAT YourApp

Вывод:

zoned fek long en-GB: 17 January 2019
zoned fek long es-ES: 17 de enero de 2019
zoned fek long zh-CN: 2019年1月17日
zoned fek long de-DE: 17. Januar 2019
zoned fek long fr-FR: 17 janvier 2019
zoned fek long it-IT: 17 gennaio 2019
zoned fek long ja-JP: 2019年1月17日
zoned fek long ko-KR: 2019년 1월 17일

Я обнаружил, что на моем Java 9 я не могу воспроизвести вашу проблему. С FormatStyle.LONG я получил 2019年1月17日 для японского языка, где вы сообщили 2019/01/17. Java получает форматы даты как часть своих региональных данных из разных источников. Начиная с Java 8 данные локали из Unicode Common Locale Data Repository (CLDR) поставляются с Java, но по умолчанию используются собственные данные локали Java. Начиная с Java 9, данные CLDR используются по умолчанию. Итак, что я делаю с вышеуказанным параметром командной строки, я говорю вашей Java 8 использовать CLDR раньше, чем собственный Java. Собственные данные локали Java указываются как COMPAT.

Другой вариант, конечно, это обновить до Java 9, 10 или 11. Это также даст вам результат, о котором вы просили.

Java 8 без опции командной строки

Невозможно добавить какую-либо дополнительную опцию в командной строке, так как это приложение будет запускаться в другой системе.

Это прискорбно. Вы можете спросить еще раз. С другой стороны, опция командной строки рискует изменить поведение во всех частях этой другой системы, поэтому вы не сможете пройти через это.

Если ничего не помогает, напишите некоторые исключения для локалей, где FormatStyle.LONG не дает вам того, что требуется. Ответ Joop Eggen показывает один из способов сделать это.

Как только менеджеры этой другой системы решат перейти на Java 9 или новее, если только они не используют опцию командной строки для использования COMAPT до CLDR, данные локали изменятся, и у вас будет возможность упростить код.

0
ответ дан Basil Bourque 17 January 2019 в 14:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: