繁体   English   中英

如何将日期字符串转换为 UTC 日期 object?

[英]How to convert Date string into UTC Date object?

我正在学习 Java 并遇到这个问题。 我有一个给定格式的日期字符串。

String dbTime = "01/01/1998 12:30:00";
final String DATE_FORMAT = "MM/dd/yyyy HH:mm:ss";

现在我想初始化/创建一个UTC时区的日期object。 为此,我尝试了以下代码

    SimpleDateFormat sdfAmerica = new SimpleDateFormat(DATE_FORMAT);
    TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
    sdfAmerica.setTimeZone(utcTimeZone);

    String sDateInAmerica = sdfAmerica.format(date); // Convert to String first
    Date dateInAmerica = new Date();
    try {
        dateInAmerica = formatter.parse(sDateInAmerica); // Create a new Date object
    } catch (ParseException e) {
        e.printStackTrace();
    }

这会将时间转换为 UTC,而不仅仅是创建日期 object。

01/02/1998 23:00:00

现在我很困惑哪种是转换时间的正确方法。 我有时间使用字符串格式,我必须将其转换为不同的格式,主要是 UTC 到 PST 或 PST 到 UTC。

经过一番研究,我找到了本教程,但无法获得预期的 output。

java.util.Date class 不是最佳选择。 虽然从外部看起来像是一个完整的日期,但它实际上只表示一个时间戳,而没有存储实际的时区信息。

在 Java 8 及更高版本上,我建议坚持使用设计更好的 java.time.* 类。

    String dbTime = "01/01/1998 12:30:00";
    String DATE_FORMAT = "MM/dd/yyyy HH:mm:ss";

    // parsed date time without timezone information
    LocalDateTime localDateTime = LocalDateTime.parse(dbTime, DateTimeFormatter.ofPattern(DATE_FORMAT));

    // local date time at your system's default time zone
    ZonedDateTime systemZoneDateTime = localDateTime.atZone(ZoneId.systemDefault());

    // value converted to other timezone while keeping the point in time
    ZonedDateTime utcDateTime = systemZoneDateTime.withZoneSameInstant(ZoneId.of("UTC"));

    // timestamp of the original value represented in UTC
    Instant utcTimestamp = systemZoneDateTime.toInstant();


    System.out.println(utcDateTime);
    System.out.println(utcTimestamp);

正如您仅从名称中所看到的,对于不同的日期用例,有不同的类。

例如 java.time.LocalDateTime 仅表示没有特定时区上下文的日期和时间,因此可用于直接解析您的字符串值。

要转换时区,您首先必须转换为 ZonedDateTime,它接受日期、时间和时区。 我已经在“systemDefault”上初始化了示例,因为在大多数较小的应用程序上,您可以使用 JVM 和操作系统的默认值来假设当前时区。 如果您想确保该值被解释为太平洋时间,您也可以直接使用 ZoneId.of("America/Los_Angeles") 。

该值可以转换为另一个时区中的另一个 ZonedDateTime,例如 UTC。

特别是对于 UTC,您还可以使用 Instant class,它仅代表 UTC 时间戳,也可以用作大多数其他类型的基础

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM