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

时间:2019-09-18 14:00:15

标签: java datetime timezone gmt

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

2 个答案:

答案 0 :(得分:0)

使用以下格式:
fromFormat =“ yyyy-mm-dd'T'HH:mm:sszXXX”
toFormat =“ yyyy-mm-dd'T'HH:mm:ssXXX”

For more details see examples listed here

答案 1 :(得分:0)

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

您的问题输入方式有误,这很可能是由于程序中的设计缺陷所致。 您不应在程序中将日期和时间作为字符串处理。始终将日期和时间保留在正确的日期时间对象中,例如InstantOffsetDateTimeZonedDateTime。提到的类来自现代的Java日期和时间API java.time,这是我们保存和处理datetime数据的最佳方法。

例如,您的问题可能变成:如何将时刻转换为用户请求的时区?时刻由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);

请用您希望的用户时区代替我在美国/纽约州放置的时区。始终以这种格式提供时区( region / city )。该代码段的当前输出为:

  

2019-09-18T01:44:35-04:00 [美国/纽约]

假设您不希望输出的[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格式。此格式非常适合序列化,也就是说,如果您需要将日期时间转换为机器可读的文本格式,例如用于持久性或与其他系统交换。虽然也易于阅读,但并不是您的用户希望看到的。就像我说的,肯定不是您应该在程序内部处理和处理的东西。

链接