Как контролировать капитализацию названий месяцев и дней, возвращаемых DateFormat?
-
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, но ваши неанглоязычные клиенты могут это не оценить...
Другие советы
Правила использования заглавных букв различны для разных языков.Названия месяцев на французском языке не следует писать с большой буквы.
Возможно, вы не захотите менять написание заглавных букв — в разных культурах с заглавной буквы пишутся разные слова (например, в немецком языке с заглавной буквы пишутся все существительные, а не только имена собственные).
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
- Большая часть функций java.time перенесена на Java 6 и 7 в ТриДесять-Бэкпорт.
- Андроид
- Более поздние версии реализации пакетов Android классов java.time.
- Для более ранних версий Android ТриTenABP проект адаптируется ТриДесять-Бэкпорт (упомянутое выше).Видеть Как использовать ThreeTenABP….
А ТриДесять-Экстра проект расширяет java.time дополнительными классами.Этот проект является испытательным полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
, и более.
У меня сейчас проблема, когда предложение начинается с «dimanche 07 mars», что не имело бы значения, если бы оно не было в начале предложения.Я думаю, это невозможно изменить, если я не буду вручную манипулировать первым символом строки.