JodaTime Установка TimeZone по сравнению с существующим DateTime

1

Я хотел бы установить часовой пояс на константу DateTime.

  1. Я хочу создать единую дату в определенном часовом поясе.
  2. Установите новый часовой пояс, чтобы получить рассчитанный объект DateTime.

Например:

DateTime currentTime = new DateTime(2015, 1, 23, 2, 0); // CONSTANT

// Looking for something that can perform this type of method.
currentTime.setTimeZone(DateTimeZone.forID("Asia/Tokyo"));
System.out.println("Asia/Tokyo Time" + currentTime);

currentTime.setTimeZone(DateTimeZone.forID("America/Montreal")
System.out.println("America/Montreal Time" + currentTime);

Как я смогу это сделать, используя API-интерфейс Joda.

  • 1
    joda-time.sourceforge.net/apidocs/org/joda/time/...
  • 1
    Я изменил ваш пример кода, чтобы сделать его более понятным - пожалуйста, проверьте мои изменения, но я считаю, что они разумны.
Теги:
datetime
jodatime

2 ответа

7
Лучший ответ

Предполагая, что вы хотите "в тот же миг, только в другом часовом поясе", тогда вы хотите withZone.

Это не setZone, потому что DateTime (как и многие типы в Joda Time) неизменен. Вместо этого вы используете withZone и используете результат. Например:

DateTime currentTime = new DateTime(2015, 1, 23, 2, 0, 0, DateTimeZone.UTC);
DateTime tokyo = currentTime.withZone(DateTimeZone.forID("Asia/Tokyo"));
System.out.println("Asia/Tokyo Time" + tokyo);

Вывод:

Asia/Tokyo Time2015-01-23T11:00:00.000+09:00

Обратите внимание: если вы не укажете часовой пояс при построении DateTime, он будет использовать часовой пояс системы по умолчанию, что редко бывает хорошей идеей. (Как отмечается в комментариях, если вы пишете код клиента, может быть, что вы хотите часовой пояс системы по умолчанию - но я рассматриваю его как наилучшую практику, чтобы указать это явно, так что это действительно ясно для всех, кто может рассмотреть возможность использования кода в другом контексте.)

  • 0
    Что заставляет вас говорить, что редко рекомендуется использовать системный часовой пояс по умолчанию? Конечно, во многих случаях это именно то, что требуется?
  • 0
    @David: почти никогда в серверном коде - и где вы хотите его в коде клиента, это гораздо яснее указать , что в явном виде, чтобы было ясно , что это сознательное решение.
Показать ещё 4 комментария
0

Глядя на вашу реализацию, вы хотите заставить DateTime вести себя как Календарь. Поскольку Calendar изменен, а DateTime - нет, почему бы не использовать MutableDateTime - измененную версию DateTime. Смотрите мой код ниже:

    //this is the mutable version of DateTime, set to UTC as default
    MutableDateTime currentTime = new DateTime(2015, 1, 23, 2, 0, DateTimeZone.UTC).toMutableDateTime(); // CONSTANT

    // Looking for something that can perform this type of method.
    currentTime.setZone(DateTimeZone.forID("Asia/Tokyo"));
    System.out.println("Asia/Tokyo Time : " + currentTime);

    currentTime.setZone(DateTimeZone.forID("America/Montreal"));
    System.out.println("America/Montreal Time : " + currentTime);

    //if you want to return a value in DateTime datatype
    currentTime.toDateTime();

Надеюсь, это работает для вас. Не унывайте!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню