Класс GregorianCalendar в Java

Я пытаюсь получить текущее время в другом часовом поясе. Я использовал этот код для этого:

GregorianCalendar calender = new         
GregorianCalendar(TimeZone.getTimeZone("Asia/Bangkok"));
    System.out.println(calender.getTime());

Но когда я запускаю этот код, этот код предоставляет текущее время в CET, поскольку время на моей локальной машине находится в CET. Я смущен. Тогда почему есть возможность предоставить TimeZone в конструкторе?


person Srijani Ghosh    schedule 03.02.2015    source источник
comment
Когда этот вопрос был задан в 2015 году, java.time, современный API даты и времени Java, отсутствовал уже год. Я рекомендую вам не использовать GregorianCalendar и Date. Эти классы плохо разработаны и давно устарели. И уж тем более пресловутые DateFormat /SimpleDateFormat, предложенные в паре ответов. См. хороший ответ Бэзила Бурка.   -  person Ole V.V.    schedule 15.02.2020


Ответы (3)


Ах, радости Java Date/Time API...

Что вам нужно (кроме лучшего API, такого как Joda Time), так это DateFormat. Он может печатать даты в указанном вами часовом поясе. Вам не нужно Calendar для этого.

dateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Bangkok"));
dateFormat.format(new Date());

Calendar предназначен для манипуляций со временем и расчетов. Например, «установите время на 10 утра». Тогда ему нужен часовой пояс.

Когда вы закончите с этими вычислениями, вы можете получить результат, вызвав calendar.getTime(), который возвращает Date.

Date — это, по сути, универсальная временная метка (в миллисекундах с 1970 года, без прикрепленной или актуальной информации о часовом поясе). Если вы вызовете toString на Date, он просто напечатает что-то в вашем часовом поясе по умолчанию. Для большего контроля используйте DateFormat.

person Thilo    schedule 03.02.2015

Что вы делаете прямо сейчас:

  • Получение календаря в часовом поясе Бангкока
  • получить объект Date для этого времени (которое находится в мс с какая-то дата 1 января 1970 года, 00:00:00 по Гринвичу)
  • распечатайте эту дату в своем часовом поясе (Date.toString() )

Вы должны использовать класс Formatter, чтобы получить желаемый результат. например SimpleDateFormat

Альтернативным решением было бы использование менее запутанной библиотеки Date/Time. например JodaTime или новый java.time пакет Java8

person Dawnkeeper    schedule 03.02.2015

tl;dr

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

java.время

Устаревшие классы даты и времени, которые вы используете, просто ужасны, имеют недостатки в дизайне и реализации, созданы людьми, которые не понимают обработку даты и времени. Полностью избегайте этих занятий.

Используйте только современные классы java.time, определенные в JSR 310< /а>.

ZoneId z = ZoneId.of( "Asia/Bangkok" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

Генерировать текст в стандартном формате ISO 8601, разумно расширенном, чтобы добавить название часового пояса в квадрате скобки.

String output = zdt.toString() ;

Для других форматов используйте DateTimeFormatter в сотнях других вопросов и ответов.

См. этот выполнение кода на IdeOne.com.

2020-02-15T12:27:31.118127+07:00[Азия/Бангкок]


Таблица типов даты и времени в Java, как современных, так и устаревших


О java.time

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

Чтобы узнать больше, см. Учебное пособие по Oracle. И поищите множество примеров и пояснений в Stack Overflow. Спецификация: 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 и подробнее.

person Basil Bourque    schedule 15.02.2020