java日期格式转换';年月日';至';yyyy-MM-dd';T';HH:mm:ss.SSSXXX';比如2021-04-05T00:00-07:00[UTC-07:00]

java日期格式转换';年月日';至';yyyy-MM-dd';T';HH:mm:ss.SSSXXX';比如2021-04-05T00:00-07:00[UTC-07:00],java,date,datetime,java-8,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

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

您需要一个
OffsetDateTime
和适当的输出,就像您想要的那样
“yyyy-MM-dd'T'HH:mmXXX'['ooo']”

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);
  • O
    用于局部区域偏移,而
    ooo
    用于
    UTC-08:00
    样式

  • X
    用于区域偏移,而
    XXX
    用于
    -08:30
    样式

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


这比你想象的要容易得多

    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类似于
美国/温哥华
美国/凤凰城
,因此区域/城市格式。在大多数情况下,对于只有UTC偏移量的日期和时间,我们应该选择
OffsetDateTime
而不是
zoneDateTime
,就像在另一个答案中一样。

我有一个小问题,为什么输出是
2021-04-05T00:00-07:00[GMT-07:00]
,而不是
2021-04-05T00:00-07:00[UTC-07:00]
。UTC和GMT之间有什么区别?实际上需要UTC而不是GMTGMT@Holinc你来了吗?您没有在我的答案的最后一行显示预期输出吗?因为这就是我想要的have@GSriHAri你试过了吗?@azro是的,我得到的输出是这样的“2021-04-05T00:00-07:00[GMT-07:00]”。我建议你不要使用
SimpleDateFormat
Date
。这些类设计得很糟糕,而且早已过时,其中前者尤其令人讨厌。您已经在使用来自的
ZonedDateTime
DateTimeFormatter
。坚持使用该API并避免不必要的转换。