Поскольку вопрос помечен java-8
, используйте java.time
API.
ОБНОВЛЕНИЕ : Для версии 4 вопроса, где было добавлено 2018-06-06T11:30:00-05:00
.
Для разбора 1528302600000
вы анализируете его в long
, а затем используете Instant.ofEpochMilli()
.
Для разбора формата, подобного 2018-06-06T11:30:00-05:00
, выможно использовать OffsetDateTime
или ZonedDateTime
.Оба могут также анализировать 2018-06-06T16:30:00Z
.
Чтобы изменить часовой пояс конкретно на конкретное смещение, например GMT+5:30
, используйте ZoneOffset
, например, ZoneOffset.of("+05:30")
или ZoneId
, например ZoneId.of("GMT+05:30")
.
Примечание 1: GMT+5:30
недопустимо.
Примечание 2: Чтобы перейти на часовой пояс региона с учетом перехода на летнее время, используйте, например, ZoneId.of("Asia/Kolkata")
.
Чтобы проанализировать все 3 формата ввода и даже поддерживать расширенный формат, например 2018-06-06T11:30-05:00[America/Chicago]
, используйтеZonedDateTime
, со специальной обработкой для номера эпохи.
public static ZonedDateTime parseToZone(String text, ZoneId zone) {
if (text.indexOf('-') == -1)
return Instant.ofEpochMilli(Long.parseLong(text)).atZone(zone);
return ZonedDateTime.parse(text).withZoneSameInstant(zone);
}
Затем вызывающий абонент может решить, следует ли использовать только смещение, а не полный часовой пояс, преобразовав его в OffsetDateTime
, используя toOffsetDateTime()
.
Тест
ZoneId india = ZoneId.of("Asia/Kolkata");
System.out.println(parseToZone("2018-06-06T16:30:00Z", india));
System.out.println(parseToZone("2018-06-06T11:30:00-05:00", india));
System.out.println(parseToZone("1528302600000", india));
System.out.println(parseToZone("1528302600000", india).toOffsetDateTime());
Выход
2018-06-06T22:00+05:30[Asia/Kolkata]
2018-06-06T22:00+05:30[Asia/Kolkata]
2018-06-06T22:00+05:30[Asia/Kolkata]
2018-06-06T22:00+05:30
Оригинальный ответ
Используйте метод parse()
с 2018-06-06T16:30:00Z
.
Используйте метод ofEpochMilli()
с 1528302600000
.
Затем используйте atZone()
для конвертации в нужный часовой пояс.
Демо
Instant instant1 = Instant.parse("2018-06-06T16:30:00Z");
Instant instant2 = Instant.ofEpochMilli(1528302600000L);
ZoneId india = ZoneId.of("Asia/Kolkata");
ZonedDateTime date1 = instant1.atZone(india);
ZonedDateTime date2 = instant2.atZone(india);
System.out.println(instant1);
System.out.println(instant2);
System.out.println(date1);
System.out.println(date2);
Вывод
2018-06-06T16:30:00Z
2018-06-06T16:30:00Z
2018-06-06T22:00+05:30[Asia/Kolkata]
2018-06-06T22:00+05:30[Asia/Kolkata]
Чтобы напечатать результат в человеческом формате, используйте DateTimeFormatter
.
DateTimeFormatter indiaFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG)
.withLocale(Locale.forLanguageTag("en-IN"));
DateTimeFormatter hindiFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG)
.withLocale(Locale.forLanguageTag("hi-IN"));
System.out.println(date1.format(indiaFormatter));
System.out.println(date1.format(hindiFormatter));
Выход
6 June 2018 at 10:00:00 PM IST
6 जून 2018 को 10:00:00 अपराह्न IST