Joda Time, конвертирующее время в зонированное время даты в миллисекунды

Может кто-нибудь объяснить мне, почему, когда я пытаюсь получить миллисекунды DateTime с зоной, отличной от моей, она возвращает мне миллисекунды моего локального часового пояса? Я ищу, чтобы получить миллисекунды UTC, но мои локальные настройки приложения установлены в EST (хотя я действительно в Ирландии;))

Здесь код:

  DateTimeFormatter format = DateTimeFormat.mediumDateTime();

  DateTime local = new DateTime();
  DateTime utc = new DateTime(System.currentTimeMillis(), DateTimeZone.UTC);
  System.out.println("utc zone = " +utc.getZone());
  System.out.println("UTC time: " + utc);
  long current = utc.getMillis();

  System.out.println("current: " + format.print(current));
  System.out.println("local: " + format.print(local.getMillis()));

Вот что он печатает:

 utc zone = UTC
 UTC time: 2013-08-16T13:36:32.444Z
 current: Aug 16, 2013 9:36:32 AM
 local: Aug 16, 2013 9:36:32 AM

В настоящее время я думал, что он должен иметь то же время, что и время UTC?

Ответы

Ответ 1

Несколько точек:

  • Вам не нужно вызывать System.currentTimeMillis(). Просто передайте это:
    DateTime utc = new DateTime(DateTimeZone.UTC);
  • Когда вы вызываете .getMillis(), результат всегда находится в UTC. Представление времени как целого, не являющегося основанием для UTC, является плохой идеей, а не тем, что предоставит Joda Time. Ваша оценка того, что миллисекунды затронуты вашим местным часовым поясом, неверна.

  • Ошибки преобразования связаны с тем, как вы вызываете format.print. Когда вы передаете целое число, поведение по умолчанию заключается в использовании текущего часового пояса, которое является вашим местным временем. Вы можете изменить его следующим образом:

    format.withZone(DateTimeZone.UTC).print(current)
  • Однако, если намерение состоит в том, чтобы печатать его как строку даты, зачем вообще начинать миллисекунды? Если вы передадите оригинал DateTime, тогда его информация о часовом поясе будет применена автоматически.
    format.print(utc)
    format.print(local)

Объединив, все это будет выглядеть так:

DateTime local = new DateTime();
DateTime utc = new DateTime(DateTimeZone.UTC);

System.out.println("local zone = " + local.getZone());
System.out.println("  utc zone = " + utc.getZone());

DateTimeFormatter format = DateTimeFormat.mediumDateTime();
System.out.println(" local: " + format.print(local));
System.out.println("   utc: " + format.print(utc));
System.out.println("millis: " + utc.getMillis());