2017-01-10 1 views
0

У меня есть экземпляр ec2, работающий в зоне Сингапура. По умолчанию часовой пояс для этого экземпляра - UTC. Поэтому я установил его в IST, предполагая, что приложение, запущенное в этом экземпляре, генерирует время в IST, которое мы храним в базе данных.new Date() дает время в UTC в ec2 Экземпляр, который настроен как IST

i.e новая дата() в моем приложении shoud return time in IST. Но он все еще генерирует время в UTC, который нам не нужен.

Итак, как сделать новую дату() дает время в IST в экземпляре ec2 без добавления явного кода Java?

+1

Как вы определяете часовой пояс? 'Date' не имеет метода getTimeZone (и' getTimeZoneOffset() 'устарел). –

+0

Я хотел бы знать, если я попытаюсь запустить небольшую программу, где я просто печатаю новую дату(), она показывает время в UTC, хотя My Instance настроен на IST. Что делать, чтобы мой объект даты давал время в IST без добавления дополнительного java-кода? Почему новая дата() не дает время в IST, основанном в часовом поясе, установленном в примере? –

+1

Думаю, вам нужно добавить еще код. Теперь вы можете рассмотреть возможность удаления устаревшего класса 'Date' и вместо этого использовать [Java 8 Data & Time API] (https://docs.oracle.com/javase/tutorial/datetime/) ([docs here ] (https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html)) –

ответ

1

Попробуйте установить -Duser.timezone="Asia/India" как переменные среды или запустить Java приложение с этим переходом от терминала с помощью java filename -Duser.timezone="Asia/India"

+0

Сделал это. Но все же он показывает время в UTC, давая ouput Вт 10 янв 10:12:49 UTC 2017. Но мне это нужно в IST –

+0

Настройка текущего часового пояса JVM должна выполняться только в экстремальных обстоятельствах, поскольку это значение по умолчанию влияет на весь код во всех приложений, работающих в этой JVM. И любой код в любом приложении в JVM может в любой момент изменить значение по умолчанию в любой момент * во время выполнения *. Намного проще просто указать желаемый/ожидаемый часовой пояс, передавая в качестве аргумента методы. –

1

java.time

ZonedDateTime.now( 
    ZoneId.of("Asia/Kolkata") 
) 

Детали

Метод DatetoString применяется смешения Текущий часовой пояс JVM по умолчанию при создании строки. Это заставляет вас думать, что у него есть назначенный часовой пояс, но он не делает. Объект Date фактически представляет значение в формате UTC. Одна из многих причин избежать этих трудных старых устаревших классов времени.

Этот класс теперь вытесняется классами java.time.

Мгновенный класс представляет собой момент в UTC.

Instant instant = Instant.now(); 

Настройте в ваш желаемый часовой пояс. Никогда не используйте аббревиатуры 3-4 букв, такие как IST. Не настоящий часовой пояс. Используйте real time zone names.

ZoneId z = ZoneId.of("Asia/Kolkata"); 
ZonedDateTime zdt = instant.atZone(z); 

Этот вопрос действительно является дубликатом многих других. Поиск переполнения стека для более широких обсуждений и примеров.

Не изменяйте часовой пояс вашей операционной системы хоста или часовой пояс JVM по умолчанию. Вам просто не следует полагаться на часовой пояс по умолчанию, поскольку он может быть изменен в любой момент во время выполнения любым кодом в любом потоке любого приложения в вашей JVM. Всегда указывайте необязательный аргумент для часового пояса при вызове классов java.time, проблема решена.


^Чтобы сделать вещи еще более запутанной, есть на самом деле временная зона в пределах Date класса, но без добытчиками и сеттеров. Используется внутри, но не относится к нашей дискуссии здесь. Эти старые устаревшие классы времени - очень запутывающий беспорядок.

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