SimpleDateFormat локализованные названия месяцев - PullRequest
6 голосов
/ 03 октября 2011

Я искал по всему сайту, но думаю, что у меня немного другая проблема, и я мог бы действительно помочь с ней, прежде чем у меня случится сердечная недостаточность или я сожгу компьютер.

Я динамически генерирую список названий месяцев (в форме июнь 2011 г., июль 2011 г.) и, очевидно, я хочу, чтобы это чувствительно к локали: поэтому я использую простой объект формата даты следующим образом:

//the actual locale name is dependent on UI selection
Locale localeObject=new Locale("pl"); 
// intended to return full month name - in local language.
DateFormat dtFormat = new SimpleDateFormat("MMMM yyyy",localeObject);
//this bit just sets up a calendar (used for other bits but here to illustrate the issue
String systemTimeZoneName = "GMT";
TimeZone systemTimeZone=TimeZone.getTimeZone(systemTimeZoneName);
Calendar mCal = new GregorianCalendar(systemTimeZone); //"gmt" time
mCal.getTime(); //current date and time

но если я сделаю это:

String value=dtFormat.format(mCal.getTime()); 

это «следует» вернуть локализованную версию названия месяца. В переводе с польского слово «сентябрь» - «Wrzesień» - обратите внимание на акцент на русском языке. Однако все, что я получаю, это "Wrzesie?"

Что я делаю не так?

Спасибо всем - теперь я согласен с тем, что это проблема с презентацией, - но как я могу "прочитать" результат из dtFormat безопасно - я добавил несколько комментариев ниже, используя refBettes и т. Д. - это работало в других ситуациях, я просто могу ' Кажется, что вы не можете получить доступ к строковому результату без ошибок

- ОКОНЧАТЕЛЬНОЕ редактирование; для всех, кто сталкивается с этой проблемой

Ответ был в блоге BalusC: http://balusc.blogspot.com/2009/05/unicode-how-to-get-characters-right.html#DevelopmentEnvironment

В основном объект DTformat возвращал UTF-8 и автоматически преобразовывался обратно в системный набор символов по умолчанию, когда я читал его в строку

поэтому этот код работал для меня

new String(dtFormat.format(mCal.getTime()).getBytes("UTF-8"),"ISO-8859-1");

Большое спасибо за помощь

Ответы [ 2 ]

4 голосов
/ 03 октября 2011

Ваша проблема не имеет ничего общего с SimpleDateFormat - вы просто ошибаетесь с результатом.

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

Я предлагаю вам проверить все кодировки, используемые в вашем приложении, если это веб-приложение, или проверить шрифт, которыйповторно отображать строку, если это консольное или Swing-приложение.

Если вы изучите строку в отладчике, я уверен, что вы увидите, что в ней есть правильные символы - просто как они добираются допользователь, который является проблемой.

0 голосов
/ 03 октября 2011

В моих тестах dtFormat.format(mCal.getTime()) возвращает

październik 2011

new SimpleDateFormat(0,0,localeObject).format(mCal.getTime()) возвращает:

poniedziałek, 3 октября 2011 г. 14:26:53 ПО ВОСТОЧНОМУ ВРЕМЕНИ

...