【问题标题】:java Date format convert 'M/d/yyyy' to 'yyyy-MM-dd'T'HH:mm:ss.SSSXXX' like 2021-04-05T00:00-07:00[UTC-07:00]java Date format convert 'M/d/yyyy' to 'yyyy-MM-dd'T'HH:mm:ss.SSSXXX' like 2021-04-05T00:00-07:00[UTC-07:00]
【发布时间】:2021-07-05 03:45:13
【问题描述】:

预期输出:2021-04-05T00:00-07:00[UTC-07:00]

String sDate1="05/04/2021";
Date date=new SimpleDateFormat("M/d/yyyy").parse(sDate1);

SimpleDateFormat sdf;
sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
String text = sdf.format(date);
System.out.println("sdf:      "+text);
ZonedDateTime d = ZonedDateTime.ofInstant(date.toInstant(),
                                          ZoneId.systemDefault());

ZonedDateTime zdt= ZonedDateTime.ofInstant(date.toInstant(), ZoneId.of("UTC"));
System.out.println("zdt:     "+  d);

DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME;
ZonedDateTime result = ZonedDateTime.parse(""+d, formatter);
System.out.println("zdt result ::   "+result);

输出:

sdf:      2021-04-05T00:00:00.000+05:30

zdt:     2021-04-05T00:00+05:30[Asia/Calcutta]

zdt result ::   2021-04-05T00:00+05:30[Asia/Calcutta]

但预期输出是这种格式2021-04-05T00:00-07:00[UTC-07:00]

【问题讨论】:

  • 我建议你不要使用SimpleDateFormatDate。这些类设计不良且过时,尤其是前者,尤其是出了名的麻烦。您已经在使用来自java.time, the modern Java date and time APIZonedDateTimeDateTimeFormatter。坚持使用该 API 并避免不必要的转换。

标签: java date datetime java-8


【解决方案1】:

您需要一个OffsetDateTime 和适当的formatter 才能像您想要的那样输出"yyyy-MM-dd'T'HH:mmXXX'['OOOO']'"

  • O 用于本地化区域偏移OOOO 用于UTC-08:00 样式

  • X 用于 zone-offsetXXX 用于 -08:30 样式

  • Locale.FRENCH 显示 UTC 而不是 GMT,真的不知道为什么在这里:/

String sDate1 = "05/04/2021";

DateTimeFormatter inFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
DateTimeFormatter outFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mmXXX'['OOOO']'");

LocalDateTime ldt = LocalDate.parse(sDate1, inFormatter).atTime(0, 0);

OffsetDateTime odt = ldt.atOffset(ZoneOffset.ofHours(-7));
String result = odt.format(outFormatter);
System.out.println(result); // 2021-04-05T00:00-07:00[UTC-07:00]

ZonedDateTime zdt = ldt.atZone(ZoneId.ofOffset("UTC", ZoneOffset.ofHours(-7)));
result = zdt.format(outFormatter);
System.out.println(result); // 2021-04-05T00:00-07:00[UTC-07:00]

【讨论】:

  • 我有个小问题,为什么输出是2021-04-05T00:00-07:00[GMT-07:00],而不是2021-04-05T00:00-07:00[UTC-07:00]。 UTC和GMT有什么区别?
  • 实际需要UTC而不是GMT
  • @Holinc 你有 GMT 显示吗?您没有在我的答案的最后一行显示预期输出吗?因为这就是我所拥有的
  • @azro 是的,我得到这样的输出 "2021-04-05T00:00-07:00[GMT-07:00]"
  • @GSriHAri 添加Locale.FRENCH 似乎可以解决,但我不知道为什么,请查看我的编辑以查看它
【解决方案2】:

这比你想象的要容易得多。

    String sDate1="05/04/2021";
    ZonedDateTime result = LocalDate.parse(sDate1, DATE_FORMATTER)
            .atStartOfDay(DESIRED_ZONE);
    System.out.println("zdt result ::   " + result);

声明使用的常量:

private static final DateTimeFormatter DATE_FORMATTER
        = DateTimeFormatter.ofPattern("dd/MM/uuuu");
private static final ZoneId DESIRED_ZONE = ZoneId.of("UTC-07:00");

并且输出是预期的:

zdt 结果 :: 2021-04-05T00:00-07:00[UTC-07:00]

注意事项:我了解到您需要UTC-07:00 的时区。这不是一个真实的时区,它只是一个 UTC 偏移量的虚构区域 ID。实时时区 ID 类似于 America/VancouverAmerica/Phoenix,因此采用 region/city 格式。对于大多数目的,对于只有 UTC 偏移量的日期和时间,我们应该更喜欢 OffsetDateTime 而不是 ZonedDateTime,就像在另一个答案中一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 2021-07-23
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多