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并避免不必要的转换。