Как избежать того, чтобы формат даты изменялся и дописывалось смещение +03:00?

99
14 августа 2019, 01:10

Есть рест - сервис, принимающий xml и обрабатывающий его библиотекой jaxb. Для одного из полей написан адаптер для даты:

public class DateAdapter extends XmlAdapter<String, Date> {
    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");
    @Override
    public String marshal(Date v) throws Exception {
        synchronized (dateFormat) {
            return dateFormat.format(v);
        }
    }
    @Override
    public Date unmarshal(String v) throws Exception {
        synchronized (dateFormat) {
            return dateFormat.parse(v);
        }
    }
}

Итак, я передаю дату "2009-12-31T23:59:59.999 +0000" и адаптер преобразует из строки в Date

Потом я вытягиваю объект из базы и передаю клиенту, то есть Date to String -> 2010-01-01T02:59:59.999 +0300 (добавились часы и временной сдвиг) и получается так, что я отдаю уже с временным смещением.

Как отключить это преобразование, зависимое от сервера, на котором выполняется код?

Answer 1

Дело в том, что вы видимо используете класс util.Date. Реализация данного класса представляет из себя хранение колличества миллесекунд по UTC от некоторой точки во времени X. Но поскольку данный класс описывает точку во времени, он ориентируется на системную временную зону.

Следовательно, как только вы распарсили время 2009-12-31T23:59:59.999 +0000 в util.Date, в этот класс сохранилось колличество миллисекунд по UTC, которые соответствуют этой точке во времени, но само представление класса util.Date оринентируется на дефолтную временную зону (у вас видимо зона +03) и нет возможности управлять зонной для данного класса, отсюда форматер SimpleDateFormat не знает какая была зона до того, как время сохранилось в util.Date на момент обратного преобразования, и ориентируется на деволтную зону.

Прежде, чем преступать к построению архитектуры приложения относительно времени, рекомендовал бы прочитать данный стандарт, описывающий возможные типы времени - Working with Time Zones. Для того, чтобы определить с каким типом времени вы работаете и тогда уже предпринимать шаги по представлению даты в системе.

В данном случае могу предложить вам посмотреть на классы, которые умеют управлять своей зоной и использовать их в преобразованиях. Например, для java версии 8 и выше - ZonedDateTime, для ранних версий - joda DateTime.

READ ALSO
При попытке получить данные из БД падает NPE

При попытке получить данные из БД падает NPE

Создал метод dbstore, который должен создавать базу, если она пуста, извелкать всех пользователей и тд

148
Мгновенная запись DataInputStream в socket

Мгновенная запись DataInputStream в socket

Всех приветствуюЯ пытаюсь сделать что-то вроде real-time video streaming'a

127
Как поместить в массив 10 000 000 000 чисел?

Как поместить в массив 10 000 000 000 чисел?

Мне нужно сделать массив в который я должна поместить 10 000 000 000 мелких чиселЯ дошла к тому что это не возможно

133
Is not assignable to Activity

Is not assignable to Activity

MusicAdapter Class

155