private static final Locale localeLoc = Locale.GERMANY;
private static final ZoneId zoneLoc = ZoneId.of("Europe/Berlin");
private static final DateTimeFormatter formatterLoc = DateTimeFormatter
.ofLocalizedDateTime(FormatStyle.SHORT, FormatStyle.LONG)
.withLocale(localeLoc);
public static void main(String[] args) {
System.out.println(getStringNow());
ZonedDateTime parsedDateTime
= getDateFromStringDateTimeFormatter("01.05.2018 00:00:00");
System.out.println(parsedDateTime);
System.out.println(parsedDateTime.format(formatterLoc));
}
public static String getStringNow() {
return ZonedDateTime.now(zoneLoc).format(formatterLoc);
}
public static ZonedDateTime getDateFromStringDateTimeFormatter(String stringDateIn) {
DateTimeFormatter formatterTmp
= DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss", localeLoc);
return LocalDateTime.parse(stringDateIn, formatterTmp).atZone(zoneLoc);
}
Запустив этот код только сейчас, он напечатал
26.05.18, 10:12:41 MESZ
2018-05-01T00:00+02:00[Europe/Berlin]
01.05.18, 00:00:00 MESZ
В своем коде вы установили локаль (GERMANY
) как для DateFormat
, так и для SimpleDateFormat
.Вы не установили часовой пояс.Несмотря на то, что локаль и часовой пояс могут быть связаны с географическим регионом (они не всегда), они не связаны напрямую, поэтому установка одного из них никогда не влияет на другой.Кроме того, если вы установите часовой пояс и языковой стандарт для SimpleDateFormat
, ни один из них не будет отражен в Date
, полученном из его метода parse
, поскольку Date
не может содержать ни часовой пояс, ни языковой стандарт.Это просто момент времени.
Вместо этого произошло то, что оба формата использовали настройку часового пояса вашей JVM.dateFormat
использовал GERMANY
локаль и, следовательно, произвел MESZ
для Mitteleuropäische Sommerzeit, немецкого названия центральноевропейского летнего времени.simpleDateFormatTmp
использовал тот же часовой пояс по умолчанию для интерпретации вашей строки даты и времени в момент времени, но, как я уже сказал, не сохранил часовой пояс в Date
.Когда вы печатали Date
, вы неявно вызывали его метод toString
.Этот метод снова использует часовой пояс вашего JVM по умолчанию для генерации строки.Этот факт многих смущает.Тем не менее, toString
всегда использует английский, поэтому день - «вторник» (для вторника), месяц - «май», а половина часового пояса - «CEST» для летнего времени Центральной Европы, того же часового пояса, который использовался.На всем пути.
Кстати, центральноевропейское летнее время не является истинным часовым поясом.Скорее, это название с учетом летнего времени, используемое для центральноевропейского времени в течение примерно 7 месяцев в году, когда действует летнее время (летнее время также известно как летнее время или летнее время).Центральноевропейское время, в свою очередь, является общим названием для большого числа европейских часовых поясов, которые делят одно и то же время в эти дни, но не всегда делали это и поэтому не могут считаться идентичными.
В моем коде я использовал ZonedDateTime
провести дату.В отличие от Date
и, как следует из названия, содержит часовой пояс, таким образом, кажется, дает вам то, что вы хотите.Его метод toString
отображает часовой пояс как Европа / Берлин.Чтобы получить MESZ, просто используйте тот же форматер, который мы использовали для другой строки.
Я настоятельно рекомендую использовать java.time
, современный Java-интерфейс даты и времени, исключив давно устаревшие DateFormat
, SimpleDateFormat
и Date
.С современным API работать намного удобнее.
Ссылка: Учебное пособие по Oracle: Дата и время , объясняющее, как использовать java.time
.