SimpleDateFormat и DataFormat имеют разный часовой пояс - PullRequest
0 голосов
/ 26 мая 2018

У меня проблема с SimpleDateFormat и DateFormat.Хотя я установил местный часовой пояс в Германии, отображаются разные часовые пояса.Вывод:

SimpleDateFormat:Tue May 01 00:00:00 CEST 2018
DateFromat: 26.05.18 08:46:24 MESZ

Мой код:

public class StringAndDateFormat {
    private static final int  dateStyleLoc = DateFormat.SHORT;
    private static final int timeStyleLoc= DateFormat.LONG;
    private static final Locale localeLoc = Locale.GERMANY;
    private static final String stringDateIni= "2000/01/01 00:00:00:";

    public static void main(String[] args) {
        System.out.println(getStringNow());
        System.out.println(getDateFromStringSimpleDateFormat("01.05.2018 00:00:00"));
    }

    public static String getStringNow() {
        DateFormat dateFormat = DateFormat.getDateTimeInstance(dateStyleLoc, timeStyleLoc, localeLoc);
        return  dateFormat.format(new Date());
    }

    public static Date getDateFromStringSimpleDateFormat(String stringDateIn) {
        SimpleDateFormat simpleDateFormatTmp = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss",localeLoc);
        Date dateTmp= null;

        try {

            dateTmp=  simpleDateFormatTmp.parse(stringDateIn);

        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return dateTmp;
    }

1 Ответ

0 голосов
/ 26 мая 2018
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.

...