Т.Л., д-р
OffsetDateTime.parse("2016-12-13T03:03:49.572-08:00")
.toZoneSameInstant(ZoneId.of("Pacific/Auckland"))
UTC
Я предполагаю, что вы имели в виду UTC, а не UCT.
Смещение против зоны
offset-from-UTC An является количество часов, минут & & секунд. Пример: -08:00
на восемь часов меньше UTC, например, на большей части западного побережья Северной Америки (и в других местах).
Часовой пояс - это смещение plus набор правил для обработки аномалий, таких как переход на летнее время (DST). Укажите proper time zone name в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте аббревиатуру 3-4 буквы, такую как EST
или IST
, так как они не настоящие часовые пояса, не стандартизированные, и даже не уникальные (!).
Вы не можете вывести зону из смещения. Вы можете угадать, но это было бы неразумно. Если вы хотите знать предполагаемый часовой пояс, вы должны спросить и быть проинформированы явно.
Именно поэтому метод ZonedDateTime::toString
разумно расширяет стандартный ISO 8601 формат YYYY-MM-DDTHH:MM:SS.S…Z
, чтобы добавить название зоны в квадратных скобках. Например, 2016-12-13T03:03:49.572-08:00[America/Los_Angeles]
.
OffsetDateTime
& ZonedDateTime
Ваша входная строка отсутствует какая-либо информация о зоне, только смещение. Итак, мы анализируем как OffsetDateTime
.
OffsetDateTime odt = OffsetDateTime.parse("2016-12-13T03:03:49.572-08:00");
Если вы хотите увидеть, что в режиме настенных часов в любой конкретной зоне отрегулируйте.
ZoneId zLosAngeles = ZoneId.of("America/Los_Angeles");
ZonedDateTime zdtLosAngeles = odt.atZoneSameInstant(zLosAngeles);
Вы можете настроить любую зону.
ZoneId zAuckland = ZoneId.of("Pacific/Auckland");
ZonedDateTime zdtAuckland = odt.atZoneSameInstant(zAuckland);
Вы всегда можете извлечь основную ценность в UTC, Instant
. Все три из этих toInstant
вызовов приводят к тому же значению, указанному выше.
Instant instant = odt.toInstant();
Instant instant = zdtLosAngeles.toInstant();
Instant instant = zdtAuckland.toInstant();
Советы:
- Обычно лучше всего работать в UTC. Храните и обменивайтесь данными в UTC, и думайте в UTC. Подумайте о UTC как о «Едином истинном времени», все смещения и зоны - всего лишь variations on the theme.
- При сериализации значений даты и времени для текста используйте стандартные форматы ISO 8601. Это их цель, и они хорошо разработаны: недвусмысленны, интуитивно понятны в разных культурах и легко разбираются.
О java.time
java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.
Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.
Где получить классы java.time?
- Java SE 8 и SE 9, а затем
- Встроенный.
- Часть стандартного Java API с объединенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и SE 7
- Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
- Android
- Проект ThreeTenABP адаптирует ThreeTen-Backport (как упоминалось выше) для Android специально.
- См. How to use….
Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more.
См. Это http://stackoverflow.com/questions/22091107/get-date-object-in-utc-format-in-java. Вы можете использовать TimeZone.getDefault() для получения локального часового пояса – pringi
Непонятно, что вы здесь задаете. Что вы подразумеваете под «форматом UCT»? Если вы имеете в виду UTC, а не UCT, вам нужно отделить часовые пояса (и смещения) от строковых форматов - они не совпадают. Вы можете легко конвертировать «2016-12-13T03: 03: 49.572-08: 00» в «Date» или «Instant», а затем конвертировать их в любой часовой пояс, который вы хотите. –
Приятно, если вы отправите дату в https://en.wikipedia.org/wiki/ISO_8601 с информацией о часовом поясе, тогда проще перейти на LocalTimeZone. ИЛИ вы получаете информацию о часовом поясе сервера в качестве другого источника? – Nagaraddi