Как контролировать капитализацию названий месяцев и дней, возвращаемых DateFormat?

StackOverflow https://stackoverflow.com/questions/66750

  •  09-06-2019
  •  | 
  •  

Вопрос

Вот программа быстрого тестирования:

    public static void main( String[] args )
{
    Date date = Calendar.getInstance().getTime();

    System.out.println("Months:");
    printDate( "MMMM", "en", date );
    printDate( "MMMM", "es", date );
    printDate( "MMMM", "fr", date );
    printDate( "MMMM", "de", date );

    System.out.println("Days:");
    printDate( "EEEE", "en", date );
    printDate( "EEEE", "es", date );
    printDate( "EEEE", "fr", date );
    printDate( "EEEE", "de", date );

}

public static void printDate( String format, String locale, Date date )
{
    System.out.println( locale + ": " + (new SimpleDateFormat( format, new Locale( locale ) )).format( date ) );
}

Результат:

Months: en: September es: septiembre fr: septembre de: September Days: en: Monday es: lunes fr: lundi de: Montag

Как я могу контролировать капитализацию имен.По какой-то причине испанцы и французы всегда возвращают имена, начинающиеся со строчной буквы.

Это было полезно?

Решение

Не все языки разделяют правила использования заглавных букв в английском языке.Я думаю, вам придется изменить данные, используемые API, но ваши неанглоязычные клиенты могут это не оценить...

about.com с французской заглавной буквой

Другие советы

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

Возможно, вы не захотите менять написание заглавных букв — в разных культурах с заглавной буквы пишутся разные слова (например, в немецком языке с заглавной буквы пишутся все существительные, а не только имена собственные).

TL; доктор

Как я могу контролировать капитализацию имен

Вы не знаете.В разных языках и разных культурах действуют разные правила использования заглавных букв, пунктуации, сокращений и т. д.

Month.from( LocalDate.now( ZoneId.of( "Pacific/Auckland" ) ) )    // Get current month.
     .getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH )     // Localize automatically. Specify `Locale` to determine human language and cultural norms for translation. 

Феврье

LocalDate.now( ZoneId.of( "Pacific/Auckland" ) )                  // Get current date as seen by people in a certain region (time zone).
    .getDayOfWeek()                                               // Get the day-of-week as a pre-defined `DayOfWeek` enum object.
    .getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH )

Лунди

Локализовать

Как заявляли другие, вам не следует навязывать свои собственные ограниченные (американский английский?) представления о капитализации.Используйте достойную библиотеку даты и времени, и пусть она автоматически локализуется для вас.

java.time

Вы используете ужасные старые классы даты и времени, которые теперь устарели и заменены классами java.time.

А LocalDate class представляет значение только даты без времени суток и часового пояса.

Часовой пояс имеет решающее значение при определении даты.В любой момент дата варьируется по всему земному шару в зависимости от зоны.Например, через несколько минут после полуночи в Париж, Франция это новый день, хотя еще «вчера» в Монреаль, Квебек.

Укажите правильное название часового пояса в формате continent/region, такой как America/Montreal, Africa/Casablanca, или Pacific/Auckland.Никогда не используйте аббревиатуру из 3–4 букв, например EST или IST как они есть нет настоящие часовые пояса, не стандартизированные и даже не уникальные (!).

ZoneId z = ZoneId.of( "Asia/Kolkata" );
LocalDate today = LocalDate.now( z );

Чтобы работать с месяцем, извлеките Month объект перечисления.То же самое для дня недели, DayOfWeek.

Вызов getDisplayName.Передайте TextStyle для сокращения.Передайте Locale определить (а) человеческий язык для перевода названия дня, названия месяца и т. д. и (б) культурные нормы, решающие вопросы сокращений, заглавных букв, пунктуации, разделителей и т. д.Обратите внимание, что Locale имеет ничего связано с часовым поясом.

Month m = today.getMonth() ;
String mNameQuébec = m.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ; 
String mNameGermany = m.getDisplayName( TextStyle.FULL , Locale.GERMANY ) ; 

…и…

DayOfWeek dow = today.getDayOfWeek() ;
String dowNameQuébec = dow.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ; 

Строка dowName Germany = dow.getDisplayName( TextStyle.FULL , Locale.GERMANY );

О java.time

А java.time Framework встроен в Java 8 и более поздних версий.Эти занятия заменяют надоедливые старые наследие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

А Джода-Время проект, сейчас в Режим обслуживания, советует перейти на java.time занятия.

Чтобы узнать больше, см. Учебное пособие по Oracle.И найдите Stack Overflow для множества примеров и объяснений.Спецификация ДжСР 310.

С JDBC-драйвер соблюдение JDBC 4.2 или позже, вы можете обменять java.time объекты непосредственно с вашей базой данных.Нет необходимости в строках или классах java.sql.*.

Где получить классы java.time?

  • Ява ЮВ 8, Ява ЮВ 9, и позже
    • Встроенный.
    • Часть стандартного Java API со встроенной реализацией.
    • В Java 9 добавлены некоторые незначительные функции и исправления.
  • Ява ЮВ 6 и Ява ЮВ 7
  • Андроид
    • Более поздние версии реализации пакетов Android классов java.time.
    • Для более ранних версий Android ТриTenABP проект адаптируется ТриДесять-Бэкпорт (упомянутое выше).Видеть Как использовать ThreeTenABP….

А ТриДесять-Экстра проект расширяет java.time дополнительными классами.Этот проект является испытательным полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter, и более.

У меня сейчас проблема, когда предложение начинается с «dimanche 07 mars», что не имело бы значения, если бы оно не было в начале предложения.Я думаю, это невозможно изменить, если я не буду вручную манипулировать первым символом строки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top