我遇到了一个时区为GMT
的日期格式,但我不明白上面日期中微秒后的连字符部分是什么,它的格式是什么?
因此,对于此日期(不带连字符(:"2021-08-03T04:10:07.502"
,格式为YYYY-MM-dd'T'HH:mm:ss.SS
Q1:对于此日期(带连字符(:"2021-08-03T04:10:07.502-0700"
,格式为:??
Q2:连字符部分是时区GMT
吗?
Q3:如果日期是微秒后的连字符形式,如何添加X位数来寻址
未来Java代码:
String dateFormatWithHyphen = "?"; // replace ? with that format
DateFormat dateFormat = new SimpleDateFormat(dateFormatWithHyphen);
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
return dateFormat;
tl;dr
输入字符串的图表,包含日期、分隔符、一天中的时间和与UTC的偏移量。
2021-08-03T04:10:07.502-0700
^date^ ^ ^time^ ^offset
separator
将您的日期与一天中的时间和UTC的偏移量作为java.time.OffsetDateTime
对象进行分析。
OffsetDateTime
.parse(
"2021-08-03T04:10:07.502-0700" ,
new DateTimeFormatterBuilder()
.parseLenient()
.append( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.appendPattern( "xx" )
.toFormatter()
)
.toString()
2021-08-03T04:10:07.502-07:00
Q1:对于此日期(带连字符(:";2021-08-03T04:10:07.502-0700";,格式为:
该字符串采用标准ISO 8601格式。
但是,该字符串省略了从UTC偏移的小时和分钟之间的可选COLON字符。我建议始终包括COLON,以最大限度地兼容机器。COLON也使它对人类更具可读性。所以使用这个:
2021-08-03T04:10:07.502-07:00
Q2:连字符部分是GMT时区吗
0700
前面的HYPHEN-MINUS特征意味着七小时的偏移量在UTC的时间本初子午线之后。
--07:00
的意思是在美洲,比UTC晚7小时。
+07:00
表示比UTC提前7小时,如泰国、越南、印度尼西亚等亚洲国家
UTC实际上是新的GMT,适用于常见的面向业务的情况。如果你正在进行火箭科学或GPS/Gileo卫星计算,你应该研究差异。如果你正在为采购订单和发票编程,不要担心。
关于你的短语,"时区GMT"……这是一个矛盾。UTC/GMT是而不是时区。它是定义偏移量的基准:一定数量的小时-分-秒。经度与本初子午线的距离,偏移量与UTC的距离。时区要多得多。时区是由政治家决定的特定地区人民使用的偏移量的过去、现在和未来变化的命名历史。
Q3:如果日期是微秒后的连字符形式,如何添加X位数来寻址
实际上,.502
是毫秒,而不是微秒。
不,日期是提前的,2021-08-03
部分,2021年8月3日。
CCD_ 12将日期部分与时间部分分离。第三部分是CCD_ 13的偏移量。
代码
你说:
DateFormat dateFormat = new SimpleDateFormat(dateFormatWithHyphen);
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
您使用的是糟糕的日期-时间类,这些类在几年前被java.time中定义的现代java.time类所取代。永远不要使用Date
、Calendar
、SimpleDateFormat
等。
使用OffsetDateTime
表示日期和一天中的时间,以UTC的特定偏移量显示。
如果您的输入包括可选的COLON,我们可以简单地这样做:
String input = "2021-08-03T04:10:07.502-07:00" ;
OffsetDateTime odt = OffsetDateTime.parse( input ) ;
如果没有COLON,我们必须指定一个格式化模式。我们可以使用DateTimeFormatterBuilder
来构建一个DateTimeFormatter
对象。
DateTimeFormatter f =
new DateTimeFormatterBuilder()
.parseLenient()
.append( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.appendPattern( "xx" )
.toFormatter()
;
使用那个格式化程序。
OffsetDateTime odt = OffsetDateTime.parse( input , f ) ;
odt.toString((:2021-08-03T04:10:07.502-07:00
好吧,这段代码很管用。但理想的解决方案是说服您的数据发布者使用完整的ISO 8601格式,包括每个偏移中的COLON。