SimpleDateFormat
позволяет указать TimeZone
для анализа.
например: formatter.setTimeZone(TimeZone.getTimeZone("America/New_York"));
Или, если вы просто хотели использовать часовой пояс GMT-5 (т.е. без каких-либо правил перехода на летнее время): formatter.setTimeZone(TimeZone.getTimeZone("GMT-5"));
Редактировать : имея возможность взглянуть на вторую часть вашей проблемы и взглянуть на используемые вами API-интерфейсы календаря - и предположим, что используемые вами классы API-интерфейсов Google приведены в com.google.apis
groupId, google-api-services-calendar
artifactId, затем вы также хотите указать TimeZone
смещения при создании экземпляра com.google.api.client.util.DateTime
.
Использование SimpleDateFormat
с указанным часовым поясом для Нью-Йорка для анализа строки «19.02.2009 16:15» в дату даст вам java.util.Date
, который переносит длинное значение 1550610900000 (независимо от вашего фактического местного часового пояса). Обратите внимание, что если вы напечатаете toString()
из этого Date
, он даст дату в часовом поясе вашего локального компьютера.Например: для меня это говорит: «Ср 20 Фев 05:15:00 SGT 2019».
DateTime
извлекает это длинное значение из указанной даты с помощью getTime () и сохраняет его как внутреннее длинное значение.
DateTime
(или, по крайней мере, версия класса DateTime Iбыстро схваченный для экспериментов ( v3-rev364-1.25.0 )) также имеет конструктор, который принимает TimeZone
, откуда он извлекает смещение из UTC через getOffset()
.Если вы не передадите его, он будет использовать TimeZone.getDefault().getOffset(value)
для внутреннего использования.Позже, когда вызывается его toString (), он будет отображать его, используя смещение, которое он сохранил (полученное из часового пояса).
Пример:
SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy hh:mm a", Locale.US);
formatter.setTimeZone(TimeZone.getTimeZone("America/New_York"));
Date date = formatter.parse("2/19/2019 4:15 PM");
DateTime startDateTimeNY = new DateTime(date,TimeZone.getTimeZone("America/New_York"));
DateTime startDateTimeSG = new DateTime(date,TimeZone.getTimeZone("Asia/Singapore"));
DateTime startDateTimeNBO = new DateTime(date,TimeZone.getTimeZone("Africa/Nairobi"));
System.out.println(startDateTimeNY); //prints 2019-02-19T16:15:00.000-05:00
System.out.println(startDateTimeSG); //prints 2019-02-20T05:15:00.000+08:00
System.out.println(startDateTimeNBO); //prints 2019-02-20T00:15:00.000+03:00
(Вы можете увидеть различные локальныераз в выводе есть)
У меня не было времени, чтобы подтвердить это, но похоже, EventDateTime
просто использует toString()
из DateTime
для значения dateTime (если вы неJsonFactory
установлено в нем).(TimeZone хранит его для другой цели?)
TLDR: указание TimeZone
на SimpleDateFormat
позволяет правильно считывать дату из ее часового пояса источника и форматировать выходные данные так, как вам нужно.изменить ваш вызов на DateTime
конструктор, чтобы использовать желаемый часовой пояс таким образом:
DateTime startDateTime = new DateTime(date,TimeZone.getTimeZone("America/New_York"));