2015-09-03 8 views
0

Может кто-нибудь, пожалуйста, объясните мне, как работает часовой пояс joda DateTime? У меня есть:joda DateTime часовой пояс

public static void main(String[] args) { 
    DateTime utc = new DateTime(new Date()).withZone(DateTimeZone.UTC); 
    DateTime nonUtc = new DateTime(new Date()); 
    long l = DateTimeZone.UTC.convertLocalToUTC(new Date().getTime(), false); 
    DateTime converted = new DateTime(l); 

    System.out.println("UTC :"+utc.toDate() + " , time zone :"+utc.getZone().getID()); 
    System.out.println("Non UTC :"+nonUtc.toDate()+ " , time zone :"+nonUtc.getZone().getID()); 
    System.out.println("Converted :"+converted.toDate()+ " , time zone :"+converted.getZone().getID()); 
} 

Результат этого ниже. Местный часовой пояс по умолчанию Europe/Athens

UTC :Thu Sep 03 10:40:30 EEST 2015 , time zone :UTC 
Non UTC :Thu Sep 03 10:40:30 EEST 2015 , time zone :Europe/Athens 
Converted :Thu Sep 03 10:40:30 EEST 2015 , time zone :Europe/Athens 

Я понимаю, что первый один создает new Date() в UTC со временем от моего по умолчанию TZ, второй создает new Date() с т.з. по умолчанию, но почему же не последний строка преобразует местное время в UTC?

ответ

0

По-моему, вы не должны пытаться использовать DateTimeZone.convertLocalToUTC(). Это весьма полезно для расчетов внутрисистемных часовых поясов. Я рекомендую использовать этот метод для любого другого варианта использования, потому что его подпись очень запутанна. Длительный аргумент должен быть локальным моментом за API. Но моменты обычно обозначаются как абсолютные глобальные моменты в контексте большинства библиотек времени и времени (даже в Joda-Time, если вы посмотрите на его класс Instant). Еще одна важная причина. Если посмотреть на длинный параметр, мы не можем сказать, является ли это локальным или глобальным параметром (тип long не передает эту информацию). Вам всегда нужен контекст, чтобы решить, здесь локально или глобально.

Теперь настоящее ядро ​​вашей «проблемы». Ваш вход в этот метод не является локальным, а всего лишь глобальным моментом (с использованием new Date().getTime()), поэтому никакого реального преобразования не происходит. И следующая строка new DateTime(l); по-прежнему будет использовать ваш часовой пояс по умолчанию на основе того же глобального момента.

Смежные вопросы