Как контролировать капитализацию названий месяцев и дней, возвращаемых DateFormat? - PullRequest
13 голосов
/ 16 сентября 2008

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

    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

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

Ответы [ 5 ]

13 голосов
/ 16 сентября 2008

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

about.com по французской капитализации

6 голосов
/ 16 сентября 2008

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

5 голосов
/ 16 сентября 2008

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

2 голосов
/ 22 июля 2017

ТЛ; др

Как я могу контролировать использование заглавных букв

Вы не. Разные языки и разные культуры имеют разные правила относительно заглавных букв, знаков препинания, аббревиатур и т. Д.

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. 

Février

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 представляет значение только для даты без времени суток и без часового пояса.

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

Укажите собственное имя часового пояса в формате 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 ) ; 

String dowNameGermany = dow.getDisplayName (TextStyle.FULL, Locale.GERMANY);

О java.time

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

Проект Joda-Time , теперь в режиме обслуживания , рекомендует выполнить переход на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

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

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

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

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

0 голосов
/ 06 марта 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...