预期输出: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]
答案 0 :(得分:1)
您需要一个 OffsetDateTime
和适当的 formatter 来按照您想要的方式输出它 "yyyy-MM-dd'T'HH:mmXXX'['OOOO']'"
O
用于 localized zone-offset,OOOO
用于 UTC-08:00
样式
X
用于 zone-offset 和 XXX
用于 -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/Vancouver
或 America/Phoenix
,所以 region/city 格式。在大多数情况下,对于只有 UTC 偏移量的日期和时间,我们应该更喜欢 OffsetDateTime
而不是 ZonedDateTime
,就像另一个答案一样。