这个日期“2021-08-03T04:10:07.502-0700”是什么日期格式?

What date format is this date "2021-08-03T04:10:07.502-0700"?

我遇到了一个时区为 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;博士

输入字符串的图表,包含日期、分隔符、time-of-day 和 offset-from-UTC。

2021-08-03T04:10:07.502-0700
  ^date^  ^   ^time^   ^offset
       separator

将 time-of-day 和 offset-from-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 格式。

但是,该字符串省略了 offset-from-UTC 的小时和分钟之间的可选 COLON 字符。我建议始终包含该 COLON 以实现机器的最大兼容性。 COLON 也使它对人类更具可读性。所以使用这个:

2021-08-03T04:10:07.502-07:00

问题 2:连字符部分是 GMT 时区吗?

0700前面的HYPHEN-MINUS字符表示七小时的偏移量落后UTC时间本初子午线。

- -07:00 表示比 UTC 晚 7 小时,如美洲所见。

  • +07:00 表示比 UTC 早 7 小时,如泰国、越南、印度尼西亚等亚洲地区所见。

UTC 是新的格林威治标准时间,实际上,就常见的 business-oriented 情况而言。如果您正在进行火箭科学或 GPS/Galileo 卫星计算,您应该研究其中的区别。如果您正在为采购订单和发票编程,请不要担心。

关于您的短语“the timezone GMT”……这是矛盾的。 UTC/GMT 是 不是 time zone. It is the baseline against which offsets are defined: a certain number of hours-minutes-seconds. What longitude is to the prime meridian, offsets are to UTC. Time zones are much more. Time zones 是对特定区域的人们使用的偏移量的过去、现在和未来变化的命名历史,由政治家。

Q3:如果微秒后的日期是连字符形式,如何添加X位数来解决?

实际上,.502milliseconds, not microseconds

不,日期在前面,2021-08-03 部分,2021 年 8 月 3 日。

T 将日期部分与时间部分分开。第三部分是-07:00.

的偏移量

代码

你说:

DateFormat dateFormat = new SimpleDateFormat(dateFormatWithHyphen); dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));

你使用的是糟糕的 date-time 类,几年前被 java.time 类 中定义的现代 java.time类 =85=]java.time。切勿使用 DateCalendarSimpleDateFormat 等。

使用 OffsetDateTime 表示具有 time-of-day 的日期,如特定 offset-from-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。