我正在从upstream 系统读取数据,它以如下的字符串格式返回日期,

String dateFromUpstream = 11-14-2022 10:41:12 EDT

现在,我希望将此字符串转换为UTC时区的日期格式,然后将其存储到我的实体中.

我试过以下几种方法,

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd-yyyy HH:mm:ss z");
LocalDateTime date = ZonedDateTime.parse(dateFromUpstream, formatter).toLocalDateTime().atZone(ZoneId.of("UTC"));

但这不会将日期更改为UTC时区.它仍然在字符串末尾给出与UTC相同的日期,而不是EDT.

有人知道我如何做到这一点然后存储到一个实体中吗?

推荐答案

将给定的日期-时间字符串解析为具有对应DateTimeFormatterZonedDateTime,然后使用ZonedDateTime#withZoneSameInstant将结果ZonedDateTime转换为Instant或另一个对应于UTC的ZonedDateTime.

Demo:

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String dateFromUpstream = "11-14-2022 10:41:12 EDT";
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM-dd-uuuu HH:mm:ss z", Locale.ENGLISH);
        ZonedDateTime zdt = ZonedDateTime.parse(dateFromUpstream, dtf);
        Instant instant = zdt.toInstant();
        System.out.println(instant);

        // Or get a ZonedDateTime at UTC
        ZonedDateTime zdtUTC = zdt.withZoneSameInstant(ZoneOffset.UTC);
        System.out.println(zdtUTC);

        // If you want LocalDateTime
        LocalDateTime ldt = zdtUTC.toLocalDateTime();
        System.out.println(ldt);
    }
}

看看这个code run at Ideone.com.

Output:

2022-11-14T15:41:12Z
2022-11-14T15:41:12Z
2022-11-14T15:41:12

100了解有关现代日期-时间API的更多信息.


Note:按照Basil Bourque的建议,您可以将解析后的日期-时间转换为协调世界时的OffsetDateTime,如下所示:

OffsetDateTime odtUTC = zdt.toOffsetDateTime()
                           .withOffsetSameInstant(ZoneOffset.UTC);

Java相关问答推荐

将成为一个比较者.比较…在现代Java中,编译器会对`CompareTo`方法进行优化吗?

Junit with Mockito for java

条件加载@ManyToMany JPA

Spring Boot 3.2.2中的@Inject和@Resource Remove

RichFaces 3.x-Spring Boot-迁移web.xml

如何调整工作时间日历中的时间

无法了解Java线程所消耗的时间

Kotlin内联互操作:强制装箱

有没有办法让扩展变得多态?

每次FXMLLoader调用ApplationConext.getBean(类)时创建@Component的新实例

在Java中将int[]矩阵添加到ArrayList中,但出现错误

SpringBoot:在条件{Variable}.isBlank/{Variable}.isEmpty不起作用的情况下进行路径变量验证

在不使用instanceof或强制转换的情况下从父类变量调用子类方法

如何使用Java对随机生成的字母数字优惠券代码进行过期设置

如何使用jOOQ在PostgreSQL中从枚举类型生成Java枚举

如何通过gradle命令行从build.gradle获得Java targetCompatibility

[Guice/MissingImplementation]:未绑定任何实现

UuidGenerator Bean 类型不匹配?

声纳覆盖范围为 0%,未生成 jacoco.xml

我可以使用一个 PoolingNHttpClientConnectionManager 运行多个 HttpAsyncClient 吗?