Как анализировать дату с GMT TimeZone на IST TimeZone и наоборот в android

Я работаю над проектом, который извлекает дату / время из бэкэнд в IST (индийское стандартное время), как показано "2013-01-09T19:32:49.103+05:30" . Однако, когда я разбираю его, используя следующий DateFormat

 DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 

После чего разбор.

 Date date = sdf.parse("2013-01-09T19:32:49.103+05:30"); System.out.println("XYZ ==============>"+date); 

Его Отображение даты в формате GMT ​​в качестве выходного, т.е.

 Wed Jan 09 14:02:49 GMT+00:00 2013. 

Я пробовал его с использованием класса TimeZone, как ..

 TimeZone timeZone=TimeZone.getTimeZone("IST"); sdf.setTimeZone(timeZone); 

Но никакого эффекта.

Как я могу получить объект класса Date имеющий дату в формате IST , а не GMT ​​…

Пожалуйста, предоставьте соответствующее решение.

РЕДАКТИРОВАТЬ:

Вот как выглядит код:

 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); TimeZone timeZone=TimeZone.getTimeZone("IST"); sdf.setTimeZone(timeZone); Date date = sdf.parse("2013-01-09T19:32:49.103+05:30"); String formattedDate=sdf.format(date); System.out.println("XYZ ==============>"+formattedDate); 

Solutions Collecting From Web of "Как анализировать дату с GMT TimeZone на IST TimeZone и наоборот в android"

Дата не имеет часового пояса. Это всего лишь держатель миллисекунд с 1 января 1970 года, 00:00:00 GMT. Возьмите тот же DateFormat, который вы использовали для синтаксического анализа, установили часовой пояс IST и отформатировали дату, как показано в следующем примере

  DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); Date date = sdf.parse("2013-01-09T19:32:49.103+05:30"); sdf.setTimeZone(TimeZone.getTimeZone("IST")); System.out.println(sdf.format(date)); 

вывод

 2013-01-09T19:32:49.103+05:30 

Обратите внимание, что шаблон XX X используется для часового пояса ISO 8601 (-08: 00) с 1.7. Если вы в 1.6 попробуйте Z См. API SimpleDateFormat для получения подробной информации о шаблонах формата

Как я могу получить объект класса 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 и его подклассы, как правило, не являются потокобезопасными.

Вы можете сделать это просто с помощью класса Calender. Пожалуйста, проверьте ниже фрагменты:

 Calendar calendar = Calendar.getInstance(); calendar.setTimeZone(TimeZone.getTimeZone("GMT")); calendar.setTimeInMillis(<--time stamp-->); //calendar.setTime(<--date object of gmt date-->); SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, yyyy 'at' hh:mm a"); sdf.setTimeZone(TimeZone.getDefault()); String result=sdf.format(calendar.getTime()); 

ТЛ; др

 OffsetDateTime.parse( "2013-01-09T19:32:49.103+05:30" ) // Parsed. .toInstant() // Adjusted to UTC. 

Смотрите код в IdeOne.com .

ISO 8601

Ваша входная строка 2013-01-09T19:32:49.103+05:30 находится в стандартном формате ISO 8601. +05:30 в конце указывает смещение-от-UTC в пять с половиной часов вперед, используемое в Индии.

java.time

Вы используете неприятные старые классы времени, теперь устаревшие, вытесненные классами java.time.

В классах java.time используются форматы ISO 8601 по умолчанию при разборе / генерации строк, представляющих значения даты и времени. Поэтому нет необходимости указывать шаблон форматирования вообще.

Поскольку ваш ввод представляет момент на временной шкале со смещением от UTC, мы анализируем как объект OffsetDateTime .

 OffsetDateTime odt = OffsetDateTime.parse( "2013-01-09T19:32:49.103+05:30" ); 

Odt.toString (): 2013-01-09T19: 32: 49.103 + 05: 30

Чтобы получить простой объект в значении UTC , извлеките Instant . Этот Instant класс является базовым классом строительного блока java.time. Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).

Вы можете думать о OffsetDateTime как Instant плюс ZoneOffset .

 Instant instant = odt.toInstant(); // UTC. 

При вызове toString объект String генерируется в стандартном формате ISO 8601. Z на конце короткий для Zulu и означает UTC.

Instant.toString (): 2013-01-09T14: 02: 49.103Z

Instant ограничено различными способами, например, при создании строк в различных форматах. Таким образом, вы можете работать с OffsetDateTime скорректированным в UTC, как его смещение; Другими словами, смещение-ноль. Класс ZoneOffset содержит константу для UTC, ZoneOffset.UTC .

 OffsetDateTime odtUtc = odt.withOffsetSameInstant( ZoneOffset.UTC ); 

Вы также можете применить смещение (или часовой пояс) к Instant . Вызов atOffset или atZone .

Класс Instant является базовым классом строительного блока java.time. Вероятно, часто используется в вашем коде, поскольку наилучшей практикой является большая часть вашей работы в UTC.

 OffsetDateTime odt = instant.atOffset( ZoneOffset.ofHoursMinutes( 5 , 30 ) ); 

Часовой пояс

Обратите внимание, что смещение-от-UTC не является часовым поясом. Часовой пояс – это смещение плюс набор правил, прошлых и настоящих, для обработки аномалий, таких как летнее время (DST) . Поэтому часовой пояс всегда предпочтительнее простого смещения, если вы действительно уверены в правильной зоне.

Укажите правильное имя часового пояса в формате continent/region , например, America/Montreal , Africa/Casablanca или Pacific/Auckland . Никогда не используйте аббревиатуру 3-4 букв, такую ​​как EST или IST поскольку они не являются настоящими часовыми поясами, а не стандартизированы и даже не уникальны (!).

Если вы знаете предполагаемый часовой пояс, примените ZoneId чтобы получить объект ZonedDateTime . Но никогда не предполагайте без проверки с источником ваших входных данных. Многие разные зоны могут иметь определенное смещение. Например, в случае нашего ввода здесь смещение +05:30 используется сегодня как в Индии ( Asia/Kolkata ), так и в Шри-Ланке ( Asia/Colombo ). Эти два часовых пояса могут иметь разные правила для различных аномалий в их прошлом, настоящем или будущем.

 ZoneId z = ZoneId.of( "Asia/Kolkata" ); ZonedDateTime zdt = odt.atZoneSameInstant( z ); 

Метод toString для ZonedDateTime распространяет стандартный формат ISO 8601, добавив имя часового пояса в квадратных скобках. В этом случае [Asia/Kolkata] .

Zdt.toString (): 2013-01-09T19: 32: 49.103 + 05: 30 [Азия / Калькутта]


О java.time

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

Проект Joda-Time , теперь в режиме обслуживания , советует перейти на java.time.

Дополнительную информацию можно найти в учебнике Oracle . И поиск 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.
    • См. Как использовать ….

Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval , YearWeek , YearQuarter и т . Д.