Java преобразовать дату utc в местную дату с помощью joda

Этот код работает, но я хочу использовать Joda-Time

public static Date dateFromUTC(Date date){
        return new Date(date.getTime() + Calendar.getInstance().getTimeZone().getOffset(date.getTime()));
    }

Я пробовал это, но не работает - в чем проблема?

public static Date dateFromUTC(Date date){
        return new DateTime(date).withZone(DateTimeZone.getDefault()).toDate();
    }

Это выглядит неправильно. Что вы пытаетесь получить? Исправление смещения часового пояса для даты, для которой он установлен неправильно? У Date нет часового пояса, поэтому нет такой вещи, как преобразование его из UTC в местный часовой пояс. См. Все о java.util.Date.

Ole V.V. 11.04.2018 14:03

К вашему сведению, проект Джода-Тайм теперь находится в Режим обслуживания, и команда советует перейти на классы java.time. См. Учебник от Oracle.

Basil Bourque 11.04.2018 22:08
2
2
1 497
2

Ответы 2

Попробуй это:

new DateTime(date, DateTimeZone.UTC)
    .toLocalDateTime() // value without timezone
    .toDateTime() // convert to default timezone
    .toDate();

Ваш код фактически ничего не делает с датой, потому что new DateTime(date) создает объект DateTime с часовым поясом по умолчанию. А затем вы просто конвертируете его обратно в java.util.Date.

Прежде всего, прочтите статью по ссылке в комментариях: https://codeblog.jonskeet.uk/2017/04/23/all-about-java-util-date/

java.util.Date не имеет часового пояса. Фактически он представляет собой момент времени: количество миллисекунд, прошедших с эпохи Unix (1 января 1970 года, в полночь по всемирному координированному времени).

Однако, когда вы печатаете Date, он использует часовой пояс JVM по умолчанию для преобразования Date в значения даты / времени, но сам Date не имеет часового пояса.

Вот почему преобразование объекта Date в другой часовой пояс не имеет смысла.

Если вы хотите узнать дату (день, месяц, год) и время (час, минута, секунда, миллисекунда), которые соответствуют Date в определенном часовом поясе, вы можете использовать Joda-Time:

// java.util.Date
Date date = new Date();

// the Date converted to UTC
DateTime utc = new DateTime(date, DateTimeZone.UTC);

// the Date converted to JVM default timezone
DateTime convertedToDefaultTz= new DateTime(date, DateTimeZone.getDefault());

Преобразование также можно выполнить с помощью другого DateTime:

DateTime convertedToDefaultTz = utc.withZone(DateTimeZone.getDefault());

DateTime Joda имеет привязанный к нему часовой пояс, поэтому теперь имеет смысл преобразовать его в другой. Но объекты Date, возвращаемые им, всегда будут одинаковыми, потому что все они представляют один и тот же момент (одну и ту же точку на временной шкале):

Date d1 = utc.toDate();
Date d2 = convertedToDefaultTz.toDate();
System.out.println(d1.equals(d2)); // true

Все потому, что - опять же - у Date нет часового пояса.

Другие вопросы по теме