Да, я вижу две основные проблемы.
- Устаревшие классы
Старые классы .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
Я не могу использовать жесткий код Locale, я должен как-то получить его из ОС. – Jumpa
'SimpleDateFormat parser1 = новый SimpleDateFormat (« dd MMMM », новый Locale (« it »)); 'вместо этого, Используйте это:' SimpleDateFormat parser1 = new SimpleDateFormat («dd MMMM», ( \t \t \t \t Locale.getDefault())); ' –