如何使用 SimpleDateFormatter 将 2019-09-18T01:44:35GMT-04:00 转换为 2019-09-18T01:44:35-04:00

How to convert 2019-09-18T01:44:35GMT-04:00 to 2019-09-18T01:44:35-04:00 using SimpleDateFormatter

我想将日期和时间转换为用户请求的时区。日期和时间采用 GMT 格式。我尝试找到解决方案,但最终字符串在结果日期中包含 GMT 字符串,例如 (2019-09-18T01:44:35GMT-04:00)。我不想在结果输出中使用 GMT 字符串。

public static String cnvtGMTtoUserReqTZ(String date, String format, String timeZone) {
    // null check
    if (date == null)
        return null;

    // create SimpleDateFormat object with input format
    SimpleDateFormat sdf = new SimpleDateFormat(format);

    // set timezone to SimpleDateFormat
    sdf.setTimeZone(TimeZone.getTimeZone(timeZone));
    try {
        // converting date from String type to Date type
        Date _date = sdf.parse(date);

        // return Date in required format with timezone as String
        return sdf.format(_date);

    } catch (ParseException e) {
        //log.info("Exception in cnvtGMTtoUserReqTime ::: " + e);
    }
    return null;
}

Actual Output : 2019-09-18T01:44:35GMT-04:00

Expected Output: 2019-09-18T01:44:35-04:00

使用这些格式:
格式 = "yyyy-mm-dd'T'HH:mm:sszXXX"
格式 = "yyyy-mm-dd'T'HH:mm:ssXXX"

For more details see examples listed here

处理日期时间对象,而不是字符串

你的问题提错了,这很可能是你程序的设计缺陷造成的。 您不应在程序中将日期和时间作为字符串处理。 始终将日期和时间保存在适当的日期时间对象中,例如 InstantOffsetDateTimeZonedDateTime.提到的 类 来自 java.time,现代 Java 日期和时间 API,这是我们保存和处理日期时间数据的最佳方法。

因此您的问题可能会变成:如何将时刻转换为用户请求的时区?时刻由 Instant 对象表示。而问题的答案是:

    ZoneId userRequestedTimeZone = ZoneId.of("America/New_York");

    Instant moment = Instant.parse("2019-09-18T05:44:35Z");
    ZonedDateTime userDateTime = moment.atZone(userRequestedTimeZone);
    System.out.println(userDateTime);

请在我放置 America/New_York 的位置替换您的用户所需的时区。始终以这种格式提供时区 (region/city)。片段的输出是:

2019-09-18T01:44:35-04:00[America/New_York]

假设您不想要输出的 [America/New_York] 部分,将日期时间格式化为您想要的字符串:

    String dateTimeWithNoZoneId = userDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
    System.out.println(dateTimeWithNoZoneId);

2019-09-18T01:44:35-04:00

后面的输出是ISO 8601格式。这种格式有利于序列化,也就是说,如果您需要将日期时间转换为机器可读的文本格式,例如为了持久化或与其他系统交换。虽然也是人类可读的,但这不是您的用户喜欢看到的。正如我所说,这当然不是您应该在程序中处理和处理的内容。

链接