Конвертировать дату в GMT - PullRequest
0 голосов
/ 26 июня 2019

Я хочу преобразовать дату в GMT.

Я получаю дату в BST, я хочу преобразовать ее в GMT без преобразования часового пояса.Пример: ** Если BST дата: ср 26 июня 13:30:13 BST 2019

Я хочу преобразовать его в ср 26 июн 2019 13:30:13 GMT **

Я хочу игнорировать информацию о часовом поясе и вернуть ту же дату, что и по Гринвичу.

Для этого я пытаюсь

        private SimpleDateFormat dateFormatLocal = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
            private SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
            private SimpleDateFormat dateFormatGmtText = new SimpleDateFormat("EEE dd MMM yyyy HH:mm:ss 'GMT'");

              dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
          String textDate = dateFormatLocal.format(date);

//Date is Wed June 26 13:30:13 BST 2019
    private Date toGMTDate(final Date date) {
            String textDate = dateFormatLocal.format(date);
            try {
                String[] dateParts = textDate.split("\\+");
                textDate = dateParts[0] + "+0000";
                return dateFormatGmt.parse(textDate);
            } catch (ParseException e) {
                return null;
            }
        }

        private String toGMT(final Date date) {
            return dateFormatGmtText.format(toGMTDate(date));
        }

Когда я звоню toGMT, он возвращает Wed 26 Jun 2019 14:30:13 GMT

Я не уверен, почему это так?Что здесь не так?

1 Ответ

2 голосов
/ 26 июня 2019

java.time

Вы сказали, что не можете использовать современный API даты и времени, но для других читателей я хотел бы сначала представить эту опцию. SimpleDateFormat и Date плохо спроектированы и сильно устарели, первые особенно печально известны, поэтому я рекомендую избегать их.

Я предполагаю, что BST относится к британскому летнему времени (существуют другие интерпретации). И я предполагаю, что вы не можете избежать получения старомодного Date объекта.

private static DateTimeFormatter formatter
        = DateTimeFormatter.ofPattern("EEE dd MMM yyyy HH:mm:ss z", Locale.UK);
private static ZoneId britain = ZoneId.of("Europe/London");
private static ZoneId gmt = ZoneId.of("Etc/GMT");

private static String toGMT(final Date date) {
    ZonedDateTime britishTime = date.toInstant().atZone(britain);
    ZonedDateTime gmtTime = britishTime.withZoneSameLocal(gmt);
    return gmtTime.format(formatter);
}

Попробуйте это с вашим Date Ср 26 июня 13:30:13 BST 2019:

    String textDate = dateFormatLocal.format(date);
    System.out.println(textDate);

    System.out.println(toGMT(date));

Вывод:

2019-06-26T13:30:13+0100
Wed 26 Jun 2019 13:30:13 GMT

Всякий раз, когда вы получаете старомодный Date, первое, что нужно сделать, это преобразовать его в Instant. Затем сделайте дальнейшие преобразования оттуда. Ключом к изменению часового пояса и сохранению даты и времени дня (час-минута-секунда дня) является метод withZoneSameLocal класса ZonedDateTime.

Я рекомендую указать локаль для форматера.

Я не уверен, почему это так? Что здесь не так?

A Date не получил, поскольку не может иметь часовой пояс. Это момент времени, не более того. Ваш метод toGMTDate возвращает момент времени, который находится на час позже: время, которое вы дали, было 13: 30: 13 + 0100, и он возвратил 13: 30: 13 + 0000, что соответствует моменту времени 14 : 30: 13 + 0100. Затем вы отформатировали этот момент времени, используя средство форматирования, которое использовало ваш часовой пояс по умолчанию, Европа / Лондон, и, следовательно, выдало 14:30:13, но в то же время напечатало GMT в строке - результат, о котором вы сообщили.

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

Если у вас действительно есть злой босс, который либо заставляет вас использовать Java 1.4 или 1.5 и / или запрещает использование внешних зависимостей, довольно простой взлом:

private String toGMT(final Date date) {
    return dateFormatGmtText.format(date);
}

Обман: Ваш dateFormatGmtText использует ваш часовой пояс по умолчанию, Европа / Лондон, но лежит и печатает GMT в отформатированной строке. Это дает тот же вывод, что и выше - вывод, который вы просили По сравнению с вашим кодом я просто опускаю преобразование даты.

Ссылка: Обучающее руководство по Oracle: Дата и время , объясняющее, как использовать java.time.

...