ZonedDateTime 到 UTC 并应用了偏移量?

Posted

技术标签:

【中文标题】ZonedDateTime 到 UTC 并应用了偏移量?【英文标题】:ZonedDateTime to UTC with offset applied? 【发布时间】:2016-06-11 21:02:15 【问题描述】:

我正在使用Java 8 这就是我的ZonedDateTime 的样子

2013-07-10T02:52:49+12:00

我得到这个值

z1.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)

其中z1ZonedDateTime

我想将此值转换为2013-07-10T14:52:49

我该怎么做?

【问题讨论】:

我还是不明白:D。它与***.com/q/35688559/1743880 有何不同? “转换为2013-07-10T14:52:49”是什么意思? 那么您想在未来 12 小时内使用相同的区域偏移量吗? 但是在你想要的输出中,没有区域偏移了。另外,如果偏移量是半小时(它存在......)怎么办? 如果您删除区域信息,这不再是区域日期时间... 我不明白。鉴于您的输入和偏移量,输出不应该提前 12 小时提前吗? 【参考方案1】:

这是你想要的吗? 这会将您的ZonedDateTime 转换为具有给定ZoneIdLocalDateTime,方法是将您的ZonedDateTime 转换为之前的Instant

LocalDateTime localDateTime = LocalDateTime.ofInstant(z1.toInstant(), ZoneOffset.UTC);

或者您可能想要用户系统时区而不是硬编码的 UTC:

LocalDateTime localDateTime = LocalDateTime.ofInstant(z1.toInstant(), ZoneId.systemDefault());

【讨论】:

嗯...我觉得很好...您可以尝试使用不同的浏览器来检查您是否有同样的问题。 无需硬编码UTC,您可以简单地使用预定义的区域偏移量:ZoneOffset.UTC 感谢@AndriiAbramov 的提示,我编辑了我的答案!【参考方案2】:

看起来您需要先转换为所需的时区 (UTC),然后再将其发送到格式化程序。

z1.withZoneSameInstant( ZoneId.of("UTC") )
  .format( DateTimeFormatter.ISO_OFFSET_DATE_TIME )

应该给你类似2018-08-28T17:41:38.213Z

【讨论】:

这对我有用:LocalDateTime _2018_3_13 = LocalDateTime.of(2018, Month.MARCH, 13, 0, 0); ZonedDateTime z1 = ZonedDateTime.of(_2018_3_13, ZoneOffset.UTC); String last = z1.withZoneSameInstant(ZoneId.of("Europe/Paris")) .format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);【参考方案3】:

@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]

【讨论】:

【参考方案4】:

如果z1ZonedDateTime 的一个实例,则表达式

z1.withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime()

使用 OP 请求的字符串表示形式评估 LocalDateTime 的实例。以下程序说明了这一点:

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 = truncatedTime.withZoneSameInstant(ZoneOffset.UTC);
    LocalDateTime truncatedTimeUtcNoZone = truncatedTimeUtc.toLocalDateTime();

    System.out.println(time);
    System.out.println(truncatedTime);
    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

【讨论】:

以上是关于ZonedDateTime 到 UTC 并应用了偏移量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在春季禁用将 ZonedDateTime 字段的时区转换为 UTC,仅用于一个字段并将其保留用于所有其他字段?

如何使用 ZonedDateTime 或 Java 8 将任何日期时间转换为 UTC

巴西的 ZonedDateTime 仍然得到 -2 而不是 -3 偏移量

OffsetDateTime 到 ZonedDateTime - 带有特定的 ZoneId

获取当前时间UTC时间的下一个15分钟时间点

在时区将 ZonedDateTime 转换为 LocalDateTime