How to Parse Date from GMT TimeZone to IST TimeZone and Vice Versa in android
Как перевести дату из часового пояса GMT в часовой пояс IST и наоборот в Android
Я работаю над проектом, который извлекает дату / время из серверной части в IST(индийское стандартное время), как показано "2013-01-09T19:32:49.103+05:30". Однако, когда я анализирую его, используя следующий DateFormat
Дата не имеет никакого часового пояса. Это всего лишь количество миллисекунд, прошедших с 1 января 1970 года, 00:00:00 по Гринвичу. Возьмите тот же формат даты, который вы использовали для синтаксического анализа, установите первый часовой пояс и отформатируйте дату, как в следующем примере
Обратите внимание, что XXшаблон X используется для часового пояса ISO 8601 (-08: 00) начиная с 1.7. Если вы находитесь в 1.6, попробуйте Z. Смотрите SimpleDateFormat API для получения подробной информации о шаблонах форматирования
Ответ 2
Как я мог бы получить объект класса Date, имеющий дату в формате IST вместо GMT...
Вы не можете. Date не имеет формата или часового пояса. Он просто представляет количество миллисекунд, прошедших с полуночи эпохи Unix 1 января 1970 года по UTC. Вместо этого Date.toString()всегда используется часовой пояс по умолчанию.
Чтобы использовать определенный формат и часовой пояс, используйте DateFormat вместо Date.toString(). Вы можете установить часовой пояс с помощью DateFormat.setTimeZone(), а затем преобразовать Date в String с помощью DateFormat.format(). DateFormat сам по себе имеет несколько заводских методов для создания, или вы можете использовать SimpleDateFormat, если хотите указать конкретный шаблон.
Как говорит Абу, Joda Timeявляется гораздо лучшим API для определения даты / времени, чем встроенный, хотя для простого форматирования даты / времени стандартная библиотека неплохо справляется. Просто обратите внимание, что DateFormat и его подклассы, как правило, не потокобезопасны.
Ответ 3
tl; dr
OffsetDateTime.parse( "2013-01-09T19:32:49.103+05:30" ) // Parsed. .toInstant() // Adjusted to UTC.
Ваша входная строка 2013-01-09T19:32:49.103+05:30 случайно находится в стандартном формате ISO 8601. +05:30 В конце указывает на смещение от UTC на пять с половиной часов вперед, используемое в Индии.
java.time
Вы используете устаревшие классы даты и времени, которые теперь являются устаревшими и заменены классами java.time.
Классы java.time по умолчанию используют форматы ISO 8601 при анализе / генерации строк, представляющих значения даты и времени. Поэтому вообще не нужно указывать шаблон форматирования.
Поскольку ваш ввод представляет момент на временной шкале со смещением от UTC, мы анализируем его как OffsetDateTime объект.
Чтобы получить простой объект со значением UTC, извлеките Instant. Этот Instant класс является базовым классом java.time. Instant Класс представляет момент на временной шкале в UTC с разрешением в наносекунды (до девяти (9) цифр десятичной дроби).
При вызове toString, String объект генерируется в стандартном формате ISO 8601. Z В конце является сокращением от Zulu и означает UTC.
instant.toString(): 2013-01-09T14:02:49.103Z
An Instant ограничен различными способами, например, при генерации строк в различных форматах. Таким образом, вы можете захотеть работать с OffsetDateTime скорректированным на UTC смещением; другими словами, смещением на ноль. ZoneOffset Класс содержит константу для UTC, ZoneOffset.UTC.
Вы также можете применить смещение (или часовой пояс) к Instant. Вызовите atOffset или atZone.
Класс Instant - это базовый класс строительных блоков java.time. Вероятно, он часто будет использоваться в вашем коде, поскольку лучше всего выполнять большую часть работы в UTC.
Обратите внимание, что смещение от UTC не является часовым поясом. Часовой пояс - это смещение плюс набор правил, прошлых и настоящих, для обработки аномалий, таких как переход на летнее время (DST). Таким образом, часовой пояс всегда предпочтительнее простого смещения, если вы действительно уверены в правильной зоне.
Укажите правильное название часового пояса в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland. Никогда не используйте 3-4-буквенные сокращения, такие как EST или IST, поскольку они не являются настоящими часовыми поясами, не стандартизированы и даже не уникальны (!).
Если вы знаете предполагаемый часовой пояс, примените ZoneId для получения ZonedDateTime объекта. Но никогда не предполагайте, не сверившись с источником ваших входных данных. У многих разных зон может быть общее определенное смещение. Например, в случае нашего ввода здесь смещение +05:30 сегодня используется как в Индии (Asia/Kolkata), так и в Шри-Ланке (Asia/Colombo). У этих двух часовых поясов могут быть разные правила для разных аномалий в их прошлом, настоящем или будущем.
ZoneIdz= ZoneId.of( "Asia/Kolkata" ); ZonedDateTimezdt= odt.atZoneSameInstant( z );
toString Метод ZonedDateTime разумным образом расширяет стандартный формат ISO 8601, добавляя название часового пояса в квадратных скобках. В данном случае, [Asia/Kolkata].
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательным полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и больше.
Ответ 4
Вы можете сделать это просто с помощью класса Calender . Пожалуйста, проверьте приведенные ниже фрагменты: