Я проанализировал java.util.Date
с, String
но он устанавливает местный часовой пояс в качестве часового пояса date
объекта.
Часовой пояс не указан в том, String
с которого Date
анализируется. Я хочу установить конкретный часовой пояс date
объекта.
Как я могу это сделать?
java
date
timezone
java.util.date
Ятендра Гоэль
источник
источник
Ответы:
Используйте DateFormat. Например,
источник
TimeZone.setDefault()
перед вызовом,getTime()
чтобы новый объект даты находился в нужном вам часовом поясе. В JDK 1.8Calendar.getTime()
звонкиreturn new Date(getTimeInMillis());
.Имейте в виду, что
java.util.Date
объекты сами по себе не содержат никакой информации о часовом поясе - вы не можете установить часовой пояс дляDate
объекта. Единственное, чтоDate
содержит объект - это количество миллисекунд, прошедших с «эпохи» - 1 января 1970 года, 00:00:00 UTC.Как показывает ZZ Coder, вы устанавливаете часовой пояс для
DateFormat
объекта, чтобы сообщить ему, в каком часовом поясе вы хотите отобразить дату и время.источник
long
поле с именемfastTime
.Date.toString()
на самом деле используетCalendar
для интерпретации этого миллисекунды. Так выводяDate
делает его появляются иметь ( по умолчанию) часовой пояс, что приводит к понятным вопросы о том , как установить , что часовой пояс.ТЛ; др
Нет часового пояса в последнее время
Как указано в других правильных ответах, у java.util.Date нет часового пояса † . Он представляет UTC / GMT (без смещения часового пояса). Очень запутанно, потому что его
toString
метод применяет часовой пояс JVM по умолчанию при генерации строкового представления.Избегайте новизны
По этой и многим другим причинам вам следует избегать использования встроенного java.util.Date & .Calendar & java.text.SimpleDateFormat. Они общеизвестно хлопотно.
Вместо этого используйте пакет java.time в комплекте с Java 8 .
java.time
Классы java.time могут представлять момент на временной шкале тремя способами:
Instant
)OffsetDateTime
сZoneOffset
)ZonedDateTime
сZoneId
)Instant
В java.time основным строительным блоком является
Instant
момент времени на UTC. ИспользуйтеInstant
объекты для большей части вашей бизнес-логики.OffsetDateTime
Примените смещение-от-UTC, чтобы приспособиться к настенным часам некоторого местоположения .
Применить,
ZoneOffset
чтобы получитьOffsetDateTime
.ZonedDateTime
Лучше применить часовой пояс , смещение плюс правила обработки аномалий, такие как летнее время (DST) .
Применить
ZoneId
к,Instant
чтобы получитьZonedDateTime
. Всегда указывайте правильное название часового пояса . Никогда не используйте 3-4 аббревиатуры, такие какEST
илиIST
которые не являются ни уникальными, ни стандартизированными.LocalDateTime
Если во входной строке отсутствовал какой-либо индикатор смещения или зоны, анализируйте как
LocalDateTime
.Если вы уверены в предполагаемом часовом поясе, назначьте a
ZoneId
для созданияZonedDateTime
. Смотрите пример кода выше в разделе tl; dr вверху.Форматированные строки
Вызовите
toString
метод любого из этих трех классов, чтобы сгенерировать строку, представляющую значение даты и времени в стандартном формате ISO 8601 .ZonedDateTime
Класс расширяет стандартный формат путем добавления имени временной зоны в скобках.Для других форматов используйте
DateTimeFormatter
класс. Обычно лучше, чтобы этот класс генерировал локализованные форматы, используя ожидаемый пользовательский язык и культурные нормы. Или вы можете указать конкретный формат.О java.time
Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как
java.util.Date
,Calendar
, иSimpleDateFormat
.Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, смотрите Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, соответствующий JDBC 4.2 или более поздней версии . Нет необходимости в строках, нет необходимости в
java.sql.*
классах.Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как
Interval
,YearWeek
,YearQuarter
, и более .Joda времени
В то время как Joda-Time все еще активно поддерживается, его создатели сказали нам перейти на java.time, как только это будет удобно. Я оставляю этот раздел нетронутым в качестве ссылки, но я предлагаю
java.time
вместо этого использовать раздел выше.В Joda-Time объект date-time (
DateTime
) действительно знает свой назначенный часовой пояс. Это означает смещение от UTC, а также правила и историю летнего времени (DST) этого часового пояса и другие подобные аномалии.Вызовите
toString
метод для генерации строки в формате ISO 8601 .Joda-Time также предлагает богатые возможности для генерации всех видов других форматов String.
При необходимости вы можете преобразовать Joda-Time DateTime в java.util.Date.
Ищите StackOverflow по запросу "joda date", чтобы найти еще много примеров, некоторые из которых довольно подробны.
† На самом деле это часовой пояс встроен в java.util.Date, используется для некоторых внутренних функций (см комментариев по этому Ответу). Но этот внутренний часовой пояс не отображается как свойство и не может быть установлен. Этот внутренний часовой пояс не тот, который используется
toString
методом при генерации строкового представления значения даты и времени; вместо этого текущий часовой пояс JVM по умолчанию применяется на лету. Поэтому в качестве стенографии мы часто говорим: «У juDate нет часового пояса». Смешение? Да. Еще одна причина, чтобы избежать этих усталых старых классов.источник
BaseCalendar.Date cdate
если она установлена. Посмотрите на исходный код здесь . Вы не можете установить часовой пояс объекта juDate, кроме как путем изменения часового пояса JVM по умолчанию с помощью вызоваTimeZone.setDefault(TimeZone.getTimeZone("NEW_TIME_ZONE"));
. Таким образом, существует смещение часового пояса, и вы можете получить его, вызвав устаревший метод juDate.getTimezoneOffset ()toString
метода, который применяет текущий часовой пояс JVM по умолчанию; снова игнорируя скрытый часовой пояс. Поэтому для краткости мы говорим, что у java.util.Date нет часового пояса. Как и искусство , это ложь, которая говорит правду.TimeZone.setDefault
, вы не устанавливаете часовой пояс объекта java.util.Date - объект Date по-прежнему игнорирует свой скрытый часовой пояс, эффективно действуя в UTC. Вы бы затронулиtoString
метод Дейта. Установка по умолчанию изменяет часовой пояс JVM по умолчанию, который обычно устанавливается на часовой пояс операционной системы хоста. Этот вызов не рекомендуется, поскольку он влияет на весь код во всех потоках всех приложений, запущенных в этой JVM, и делает это на лету по мере их выполнения. Будучи грубым и опасным, этот призыв следует рассматривать только как последнее средство.equals
,hashcode
,getTime
..) Если вы посмотрите наequals
метод, он вызывает ,getTime()
который вызовыgetTimeImpl()
, которые вызовы ,normalize()
еслиcdate
свойство не нормированы. Вnormalize()
методе последнее условие if пересчитывает миллисекунды с 1/1/70 на основе сохраненной информации о часовом поясе, если часовой поясcdate
отличается от часового пояса текущей среды JVM, в которой он работает. (Взгляните наsun.util.calendar.AbstractCalendar getCalendarDate(long millis, CalendarDate date)
)Вы также можете установить часовой пояс на уровне JVM
вывод:
источник
TimeZone.setDefault
довольно радикальный, поскольку он затрагивает всю JVM, затрагивает все другие объекты и потоки. Посмотрите этот ответ для деталей, включая еще больше сложностей, если вы работаете с SecurityManager. Добавление еще более сложного: это поведение изменилось в различных версиях Java, как обсуждалось в этом Вопросе .Если вам нужно работать только со стандартными классами JDK, вы можете использовать это:
Кредит идет на этот пост .
источник
java.util.Calendar
это обычный способ обработки часовых поясов, используя только классы JDK. У Apache Commons есть еще несколько альтернатив / утилит, которые могут оказаться полезными. Редактировать записку Спонга напомнило мне, что я слышал действительно хорошие вещи о Joda-Time (хотя сам не использовал его).источник
Period
,Duration
иInterval
. Эти пролеты включают в себя методы сравнения , такие какcontains
,abuts
,overlap
, иgap
. ИPeriodFormatterBuilder
может построить описательные фразы, такие как «15 лет и 8 месяцев».Преобразуйте дату в строку и сделайте это с SimpleDateFormat.
источник
Если кому-то это понадобится, если вам нужно преобразовать
XMLGregorianCalendar
часовой пояс в ваш текущий часовой пояс из UTC, тогда все, что вам нужно сделать, это установить часовой пояс0
, а затем позвонитьtoGregorianCalendar()
- он останется в том же часовом поясе, но онDate
знает, как преобразовать его в ваш, так что вы можете получить данные оттуда.Результат:
источник
Этот код был полезен в приложении, над которым я работаю:
источник