2016-02-28 1 views
0

У меня есть DateTime как 2011-01-11 01:51:10 и часовой пояс, как America/Los_AngelesКак применить часовой пояс при форматировании DateTime?

Я хочу, чтобы получить локализованное время даты для этого значения. Это то, что я делаю

val formatter1: DateTimeFormatter = DateTimeFormatter.ofPattern("y-M-d H:m:s"); 
val m1: LocalDateTime = LocalDateTime.parse("2011-01-11 01:51:10", formatter1); 
println("DateTime: " + m1.atZone(ZoneId.of("America/Los_Angeles"))) 

Значение, я получаю это

DateTime: 2011-01-11T01:51:10-08:00[America/Los_Angeles] 

Как преобразовать его в локализованном DateTime с -08:00 смещения применяется к нему и не [America/Los_Angeles]?

+0

Я не уверен, что понимаю. «LocalDateTime» не имеет концепции часового пояса. – Tunaki

+0

уверен, мне хотелось бы вернуться назад '8 часов', применив смещение – daydreamer

+0

Что вы пытаетесь преобразовать * в *? Какой-то другой часовой пояс? УНИВЕРСАЛЬНОЕ ГЛОБАЛЬНОЕ ВРЕМЯ? Как указано в настоящее время, вы создаете «ZonedDateTime», который является местным временем и часовым поясом, который вы предоставили. (1:51:10 утра в тихоокеанское время), вы ничего с этим не делаете. Вероятно, вы хотите '.toInstant()' или '.withZoneSameInstant (someOtherZone)'. –

ответ

2

Вы должны сначала определить, какой часовой пояс, что время, которое вы разобран в Затем указать другую, чтобы преобразовать в..

DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("y-M-d H:m:s"); 
LocalDateTime m1 = LocalDateTime.parse("2011-01-11 01:51:10", formatter1); 
ZonedDateTime z1 = m1.atZone(ZoneId.of("UTC")); 
ZonedDateTime z2 = z1.withZoneSameInstant(ZoneId.of("America/Los_Angeles")); 

System.out.println(z2.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); 
+0

Огромное спасибо @softarn. У меня была большая путаница в понимании API – daydreamer

-1

Возможно, вы хотите получить время UTC, а затем применить к нему временную шкалу. Это очень легко сделать с временем Джоды. Например:

DateTime.now().minus(timezoneOffset) 

где timezoneOffset is int, который будет представлять сдвиг во времени в вашем местоположении. Поправьте меня если я ошибаюсь.

+3

Часовой пояс! = Смещение. Вы заранее не знаете смещения, и вычитание это неправильный подход. Кроме того, OP уже демонстрирует использование API-интерфейса Java 8 time API, поэтому время Joda не подходит. Сохраните это для Java 7 и ниже. –

3

Похоже, вы используете API java.time, у которого есть ZonedDateTime. Вероятно, вы должны использовать его вместо LocalDateTime, так как LocalDateTime не имеет часового пояса. Из документов:

Дата, без по времени зоны в календарной системе ISO-8601, например, 2007-12-03.

Этот класс не хранит и не представляет собой временной или часовой пояс. Вместо этого это описание даты, используемой для дней рождения. Он не может представлять мгновение на временной линии без дополнительной информации, такой как смещение или временная зона.

И затем, ZonedDateTime docs states that:

Даты, время с временной зоной в календарной системе ISO-8601, например, 2007-12-03T10: 15: 30 + 01: 00 Европа /Париж.

Этот класс обрабатывает преобразование из локальной временной линии LocalDateTime в мгновенную линию Instant. Разница между двумя временными линиями - это смещение от UTC/Greenwich, представленное ZoneOffset.

Использование ZonedDateTime, ваш код будет, как:

import java.time._ 
import java.time.format._ 

val zoneId = ZoneId.of("America/Los_Angeles") 
val formatter = DateTimeFormatter.ofPattern("y-M-d H:m:s").withZone(zoneId) 
val zdt = ZonedDateTime.parse("2011-01-11 01:51:10", formatter) 

Результат вы увидите на консоли будет:

zdt: java.time.ZonedDateTime = 2011-01-11T01:51:10-08:00[America/Los_Angeles] 

Это происходит потому, что вы используете default toString method of ZonedDateTime и похоже, что DateTimeFormatter.ISO_OFFSET_DATE_TIME - это именно то, что вы хотите. Так что ваш код должен быть:

import java.time._ 
import java.time.format._ 

val zoneId = ZoneId.of("America/Los_Angeles") 
val formatter = DateTimeFormatter.ofPattern("y-M-d H:m:s").withZone(zoneId) 
val zdt = ZonedDateTime.parse("2011-01-11 01:51:10", formatter) 
val formatted: String = zdt.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME) 
+0

Ответ '2011-01-11T01: 51: 10-08: 00 [America/Los_Angeles]' вместо '2011-01-11T17: 51: 10' – daydreamer

+0

См. Изменения, внесенные в ответ. – marcospereira

+0

Я дошел так далеко, но ответ по-прежнему «2011-01-11T01: 51: 10-08: 00' – daydreamer

0

Пожалуйста, зайдите в мой полный ответ для этого.Answer

String dateTime = "MM/dd/yyyy HH:mm:ss"; 
    String date = "09/17/2017 20:53:31"; 
    Integer gmtPSTOffset = -8; 
    ZoneOffset offset = ZoneOffset.ofHours(gmtPSTOffset); 

    // String to LocalDateTime 
    LocalDateTime ldt = LocalDateTime.parse(date, DateTimeFormatter.ofPattern(dateTime)); 
    // Set the generated LocalDateTime's TimeZone. In this case I set it to UTC 
    ZonedDateTime ldtUTC = ldt.atZone(ZoneOffset.UTC); 
    System.out.println("UTC time with Timezone   : "+ldtUTC); 

    // Convert above UTC to PST. You can pass ZoneOffset or ZoneId for 2nd parameter 
    LocalDateTime ldtPST = LocalDateTime.ofInstant(ldtUTC.toInstant(), offset); 
    System.out.println("PST time without offset   : "+ldtPST); 

    // If you want UTC time with timezone 
    ZoneId zoneId = ZoneId.of("America/Los_Angeles"); 
    ZonedDateTime zdtPST = ldtUTC.toLocalDateTime().atZone(zoneId); 
    System.out.println("PST time with Offset and TimeZone : "+zdtPST);