Преобразование даты и времени на основе TimeZone Java/Groovy

Я нахожусь в MST, и я хочу, чтобы моя дата в PST. Я установил часовой пояс, который я хочу. Теперь, если я сделаю c.getTime() Я всегда получаю время на сервере. Вместо этого я хочу Pacific Date time. Помогите пожалуйста Как получить дату и время объекта в указанном часовом поясе.

   Calendar c= Calendar.getInstance();
   TimeZone timezone= TimeZone.getTimeZone("PST"); 
   c.setTimeZone(timezone)

4 ответа

Или используйте JodaTime

@Grab( 'joda-time:joda-time:2.3' )
import org.joda.time.*

def now = new DateTime()
println now.withZone( DateTimeZone.forTimeZone( TimeZone.getTimeZone( "PST" ) ) )
​TimeZone.setDefault(TimeZone.getTimeZone('PST'))
println new Date() //PST time

Вы можете установить часовой пояс по умолчанию на PST/MST в соответствии с вашими потребностями, а затем получить дату. Я бы сделал это в тестовом методе, если это возможно.

(a) Используйте Joda-Time (или новый JSR 310, встроенный в Java 8). Даже не думайте об использовании заведомо плохого java.util.Date/Calendar.

(б) Ваш вопрос неясен. Ваши комментарии к ответам говорят о сравнении, но вы ничего не говорите о сравнении в своем вопросе.

(c) Избегайте использования трехбуквенных сокращений часовых поясов. Прочитайте примечание об устаревании в документе Joda-Time для класса TimeZone.

(d) Избегайте часового пояса по умолчанию. Скажи что ты имеешь в виду. Часовой пояс вашего компьютера может изменяться намеренно или нет.

(e) Найдите в Stackru "joda", чтобы найти множество фрагментов кода и примеров.

(f) Вот пример кода Joda-Time, с которого можно начать.

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.

// Specify your time zone rather than rely on default.
org.joda.time.DateTimeZone californiaTimeZone = org.joda.time.DateTimeZone.forID( "America/Los_Angeles" );
org.joda.time.DateTimeZone denverTimeZone = org.joda.time.DateTimeZone.forID( "America/Denver" );

org.joda.time.DateTime nowDenver = new org.joda.time.DateTime( denverTimeZone );
org.joda.time.DateTime nowCalifornia = nowDenver.toDateTime( californiaTimeZone );

// Same moment in the Universe’s timeline, but presented in the local context.
System.out.println( "nowDenver: " + nowDenver );
System.out.println( "nowCalifornia: " + nowCalifornia );

Когда беги…

nowDenver: 2013-11-21T18:12:49.372-07:00
nowCalifornia: 2013-11-21T17:12:49.372-08:00

О Joda-Time...

// Joda-Time - The popular alternative to Sun/Oracle's notoriously bad date, time, and calendar classes bundled with Java 7 and earlier.
// http://www.joda.org/joda-time/

// Joda-Time will become outmoded by the JSR 310 Date and Time API introduced in Java 8.
// JSR 310 was inspired by Joda-Time but is not directly based on it.
// http://jcp.org/en/jsr/detail?id=310

// By default, Joda-Time produces strings in the standard ISO 8601 format.
// https://en.wikipedia.org/wiki/ISO_8601

// About Daylight Saving Time (DST): https://en.wikipedia.org/wiki/Daylight_saving_time

// Time Zone list: http://joda-time.sourceforge.net/timezones.html

tl;dr

ZonedDateTime
.now(
    ZoneId.of( "America/Los_Angeles" )
)

Посмотрите, как этот код запускается вживую на IdeOne.com. (Имейте в виду, что системные часы на этом сайте сегодня отстают примерно на полчаса.)

zdt.toString(): 2019-07-27T12:29:42.029531-07:00[Америка / Los_Angeles]

java.time

Современный подход использует классы java.time, встроенные в Java 8 и более поздние версии, определенные в JSR 310.

Я нахожусь в MST и хочу, чтобы дата была в PST. Я устанавливаю часовой пояс, который хочу.

Никогда не зависите от текущего часового пояса JVM по умолчанию во время выполнения. Как программист, вы не можете контролировать это значение по умолчанию. Таким образом, результаты вашего кода могут неожиданно отличаться.

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

Теперь, если я использую c.getTime(), я всегда получаю время своего сервера.

Научитесь думать не о времени клиента или сервера, а о времени UTC. Большая часть вашей бизнес-логики, хранения данных, обмена данными и ведения журналов должны выполняться в формате UTC. Думайте о UTC как о One True Time™, а все остальные смещения / зоны - всего лишь вариации.

Для UTC используйте Instant.

Instant instant = Instant.now() ;  // Capture the current moment in UTC.

Сгенерируйте текст, представляющий этот момент, в стандартном формате ISO 8601.

String output = instant.toString() ;

Вместо этого мне нужно время Pacific Date. Пожалуйста, помогите Как получить объект даты и времени в указанном часовом поясе.

Ни одно из ваших условий (Pacific, MST, или PST) - истинные часовые пояса.

Укажите правильное название часового пояса в форматеContinent/Region, Такие как America/Montreal, Africa/Casablanca, или Pacific/Auckland. Никогда не используйте сокращение из 2–4 букв, напримерEST или ISTпоскольку они не являются настоящими часовыми поясами, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;  

Чтобы перейти от UTC к часовому поясу, примените ZoneId чтобы получить ZonedDateTime.

ZoneId z = ZoneId.of( "America/Edmonton" ) ;  // https://time.is/Edmonton
ZonedDateTime zdt = instant.atZone( z ) ;

И попробуйте один из часовых поясов на западном побережье Северной Америки.

ZoneId z = ZoneId.of( "America/Los_Angeles" ) ;  // https://time.is/Los_Angeles
ZonedDateTime zdt = instant.atZone( z ) ;

Для создания строк в форматах, отличных от ISO 8601, используйте DateTimeFormatterучебный класс. Переполнение стека поиска, так как это уже много раз освещалось.


О java.time

Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Чтобы узнать больше, см. Oracle Tutorial. И поищите в stackru множество примеров и объяснений. Спецификация - JSR 310.

Проект Joda-Time, находящийся сейчас в режиме обслуживания, рекомендует перейти на классы java.time.

Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или новее. Нет необходимости в струнах, нет необходимости вjava.sql.* классы.

Где взять классы java.time?

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательной площадкой для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, например Interval, YearWeek, YearQuarter и многое другое.

У объекта Java Date нет часового пояса - он просто представляет момент времени.

Если вы хотите отформатировать дату в часовом поясе, вы можете установить ее в классе DateFormat. Например:

    Date date = new Date ();
    DateFormat df = DateFormat.getDateTimeInstance();
    df.setTimeZone(TimeZone.getTimeZone("PST"));
    System.out.println(df.format(date));
    df.setTimeZone(TimeZone.getTimeZone("EST"));
    System.out.println(df.format(date));

покажет время в PST, затем время в EST.

У меня недавно была аналогичная проблема, и установка часового пояса на локаль сработала для меня лучше (т.е. не EST/EDT, а America/New_York). Я попробовал EST, затем попытался сделать поправку на летнее время для EDT, и это оказалось чертовски проще. Установите для своего часового пояса то, что вы хотите, затем используйте объект Date для создания новой даты, и это будет для этого часового пояса. Затем вы можете использовать метод форматирования для получения метки времени, как вам нравится.

TimeZone.setDefault(TimeZone.getTimeZone("America/New_York"));
Date date = new Date();
timeStamp = date.format('yyyy-MM-dd HH:mm:ss.SSSZ');
System.out.println(timeStamp);

Возврат

"2019-07-25 17:09:23:626-0400"
Другие вопросы по тегам