java日期格式将'M/d/yyyy'转换为'yyyy-MM-dd'T'HH:mm:ss.SSSXXX',如2021-04-05T00:00-07:00[UTC-07:00]

时间:2021-04-09 08:59:23

标签: java date datetime java-8

预期输出: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]

2 个答案:

答案 0 :(得分:1)

您需要一个 OffsetDateTime 和适当的 formatter 来按照您想要的方式输出它 "yyyy-MM-dd'T'HH:mmXXX'['OOOO']'"

  • O 用于 localized zone-offsetOOOO 用于 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]

答案 1 :(得分:0)

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

    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,就像另一个答案一样。

相关问题