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

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";

现在我想 initialize/create UTC 时区的日期对象。 为此,我尝试了以下代码

    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,而不仅仅是创建日期对象。

01/02/1998 23:00:00

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

经过一些研究,我找到了 this 教程,但无法获得预期的输出。

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

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

    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);

正如您仅从名称中可以看出的那样,对于不同的日期用例,class有不同的名称。

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

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

这个值可以转换成另一个时区的另一个 ZonedDateTime,例如UTC.

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