2015-09-29 3 views
0

Я это:Дата Месяц Локализация

2015-09-18 12:24:16 

И мне это нужно:

18 settembre (localized month string) 

Я пробовал так:

private String formatDate(String dateString) { 
     String formattedDate = ""; 
     Date date; 
     final SimpleDateFormat sdf = 
     new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); 

     try { 
      date = sdf.parse(dateString); 
      sdf.applyPattern("dd MMMM"); 
      formattedDate = sdf.format(date); 
     } catch (ParseException pe) { 
      pe.printStackTrace(); 
     } 

     return formattedDate; 
    } 

Любую ловушку с этим кодом? Можно ли это упростить? Locale.getDefault всегда получит правильный перевод? Почему applyPattern док говорит:

«Изменение шаблона этой простой формат даты к указанному шаблону, который использует не локализованы шаблон символов

ответ

3
SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
Date d1 = parser.parse("2015-09-18 12:24:16"); 
SimpleDateFormat parser1 = new SimpleDateFormat("dd MMMM",new Locale ("it")); 
System.out.println(parser1.format(d1)); 

Выход:.

18 settembre 
+0

Я не могу использовать жесткий код Locale, я должен как-то получить его из ОС. – Jumpa

+0

'SimpleDateFormat parser1 = новый SimpleDateFormat (« dd MMMM », новый Locale (« it »)); 'вместо этого, Используйте это:' SimpleDateFormat parser1 = new SimpleDateFormat («dd MMMM», ( \t \t \t \t Locale.getDefault())); ' –

0

для стандартного языкового стандарта используйте это: locale.getDefault().

SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     Date d1 = null; 
     try { 
      d1 = parser.parse("2015-09-18 12:24:16"); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
     SimpleDateFormat parser1 = new SimpleDateFormat("dd MMMM",Locale.getDefault()); 
     System.out.println(parser1.format(d1)); 
0

Вы можете попробовать это: -

Calendar calendar = Calendar.getInstance(); 
Date currDate = Util.getCurrentDate(); 
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
String date = formatter.format(calendar.getTime()); 
0

Да, я вижу две основные проблемы.

  • Устаревшие классы
    Старые классы .Date/.Calendar, как известно, хлопотное. Избежать их.
  • Часовой пояс
    Дата меняется в зависимости от вашего часового пояса в.

Избегайте java.util.Date/.Calendar

Избегайте старых классов java.util.Date/.Calendar , Заведомо запутанный, хлопотный и ошибочный. Вместо этого используйте успешную библиотеку Joda-Time. В Java 8 и более поздних версиях используется новая встроенная фреймворк java.time, вдохновленный Joda-Time.

Часовой пояс

Если точность имеет значение, применяйте часовые пояса. Дата зависит от того, где вы находитесь на земном шаре. Например, новый день поднимается раньше в Париже, чем в Монреале.

В идеале ваша строка ввода будет включать либо смещение-от-UTC, и/или часовой пояс. Если нет, вы должны знать зону. Скажите парсеру, что использовать зону.

DateTimeZone zone = DateTimeZone.forID("America/Montreal"); 

ISO 8601

Ваша строка почти в стандартном формате в соответствии ISO 8601. Эти стандартные форматы используются по умолчанию в Joda-Time. Поэтому нет необходимости определять шаблон формата, если мы заменим пространство посередине на T.

String input = "2015-09-18 12:24:16"; 
String inputStandard = input.replace(" " , "T"); 
DateTime dateTime = new DateTime(inputStandard , zone); 

Чтобы получить наш желаемый результат Струнный укажите Locale для нужного человеческого языка.

Locale locale = Locale.CANADA_FRENCH; 

Если вы хотите, текущее значение по умолчанию в JVM в Locale, я предлагаю вам позвонить для того, чтобы сделать код самодокументируемыми и явным.

Locale locale = Locale.getDefault(); 

Но помните, что текущее значение по умолчанию можно изменить в любой момент с помощью вызова setDefault любого кода в любом потоке в любом приложении в вашей виртуальной машины Java. Я предлагаю указать Locale, а не полагаться на значение по умолчанию.

Определить formatter по specifying a pattern. Скажите форматированию, чтобы использовать конкретный Locale, а не ваш JVM's current default.

DateTimeFormatter formatter = DateTimeFormat.forPattern("d MMMM"); 
formatter = formatter.withLocale(locale); 
String output = formatter.print(dateTime); 

Дамп для консоли.

System.out.println("input: " + input + " in zone: " + zone + " is: " + dateTime); 
System.out.println("In locale: " + locale + " = " + output); 

При запуске.

input: 2015-09-18 12:24:16 in zone: America/Toronto is: 2015-09-18T12:24:16.000-04:00 
In locale: fr_CA = 18 septembre 
Смежные вопросы