ZonedDateTime в UTC со смещением?
Я использую Java 8
Это то, что мой ZonedDateTime
похоже
2013-07-10T02:52:49+12:00
Я получаю это значение как
z1.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
где z1
это ZonedDateTime
,
Я хотел преобразовать это значение как 2013-07-10T14:52:49
Как я могу это сделать?
5 ответов
Похоже, вам нужно конвертировать в нужный часовой пояс (UTC) перед отправкой в форматтер.
z1.withZoneSameInstant( ZoneId.of("UTC") )
.format( DateTimeFormatter.ISO_OFFSET_DATE_TIME )
должен дать вам что-то вроде 2018-08-28T17:41:38.213Z
Это то, что вы хотите? Это преобразует ваш ZonedDateTime
к LocalDateTime
с данным ZoneId
конвертируя ваши ZonedDateTime
для Instant
до.
LocalDateTime localDateTime = LocalDateTime.ofInstant(z1.toInstant(), ZoneId.of("UTC"));
Или, может быть, вам нужен системный часовой пояс пользователя вместо UTC:
LocalDateTime localDateTime = LocalDateTime.ofInstant(z1.toInstant(), ZoneId.systemDefault());
@SimMac Спасибо за ясность. Я также столкнулся с той же проблемой и смог найти ответ по его предложению.
public static void main(String[] args) {
try {
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 Zone 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);
} catch (Exception e) {
}
}
Выход:
UTC time with Timezone : 2017-09-17T20:53:31Z
PST time without offset : 2017-09-17T12:53:31
PST time with Offset and TimeZone : 2017-09-17T20:53:31-08:00[America/Los_Angeles]
Если
z1
это пример
ZonedDateTime
, то выражение
z1.withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime()
оценивается как экземпляр
LocalDateTime
со строковым представлением, запрошенным OP. Это иллюстрируется следующей программой:
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;
public class Main {
public static void main(String[] args) {
ZonedDateTime time = ZonedDateTime.now();
ZonedDateTime truncatedTime = time.truncatedTo(ChronoUnit.SECONDS);
ZonedDateTime truncatedTimeUtc = trucatedTime.withZoneSameInstant(ZoneOffset.UTC);
LocalDateTime truncatedTimeUtcNoZone = truncatedTimeUtc.toLocalDateTime();
System.out.println(time);
System.out.println(trucatedTime);
System.out.println(truncatedTimeUtc);
System.out.println(truncatedTimeUtcNoZone);
}
}
Вот пример вывода:
2020-10-26T16:45:21.735836-03:00[America/Sao_Paulo]
2020-10-26T16:45:21-03:00[America/Sao_Paulo]
2020-10-26T19:45:21Z
2020-10-26T19:45:21
Я хотел преобразовать это значение как
2013-07-10T14:52:49
2013-07-10T02:52:49+12:00 ≠ 2013-07-10T14:52:49 в UTC
2013-07-10T02:52:49+12:00 = 2013-06-09T14:52:49 в UTC (что получается путем вычитания 12:00 часов смещения из 2013-07-10T02:52:49).
Демо:
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
class Main {
public static void main(String[] args) {
ZoneOffset zoneOffset = ZoneOffset.of("+12:00");
OffsetDateTime odtGiven = OffsetDateTime.of(LocalDateTime.of(2013, 7, 10, 2, 52, 49), zoneOffset);
System.out.println(odtGiven);
OffsetDateTime odtUtc = odtGiven.withOffsetSameInstant(ZoneOffset.UTC);
System.out.println(odtUtc);
System.out.println(odtUtc.toLocalDateTime());
}
}
Выход :
2013-07-10T02:52:49+12:00
2013-07-09T14:52:49Z
2013-07-09T14:52:49
Узнайте о современном API Date-Time из Trail: Date Time.