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

Ati*_*ska 1 java datetime date

我遇到了时区为的日期格式,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;
Run Code Online (Sandbox Code Playgroud)

Bas*_*que 5

太长了;博士

\n

输入字符串的图表,包含日期、分隔符、时间和相对 UTC 的偏移量。

\n
2021-08-03T04:10:07.502-0700\n  ^date^  ^   ^time^   ^offset\n       separator\n
Run Code Online (Sandbox Code Playgroud)\n

将日期与时间和相对于 UTC 的偏移量解析为对象java.time.OffsetDateTime

\n
OffsetDateTime\n.parse( \n    "2021-08-03T04:10:07.502-0700" , \n    new DateTimeFormatterBuilder()\n    .parseLenient()\n    .append( DateTimeFormatter.ISO_LOCAL_DATE_TIME )\n    .appendPattern( "xx" )\n    .toFormatter()\n)\n.toString()\n
Run Code Online (Sandbox Code Playgroud)\n
\n

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

\n
\n

Q1:对于这个日期(带连字符):“2021-08-03T04:10:07.502-0700”,格式为:??

\n

该字符串采用标准ISO 8601格式。

\n

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

\n
\n

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

\n
\n

Q2:连字符部分是时区 GMT 吗?

\n

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

\n

-\xc2\xa0-07:00表示比 UTC 晚 7 小时,如美洲地区所示。

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

实际上,就常见的商业情况而言,UTC 是新的 GMT。如果您正在进行火箭科学或 GPS/伽利略卫星计算,您应该研究其中的差异。如果您正在为采购订单和发票进行编程,请不要担心。

\n

关于你的短语,\xe2\x80\x9c时区GMT\xe2\x80\x9d\xe2\x80\xa6这是一个矛盾。UTC/GMT不是。它是定义偏移量的基线:一定数量的小时-分钟-秒。经度是相对于本初子午线,偏移量是相对于 UTC。时区更多。时区是政治家决定的特定地区人民使用的偏移量的过去、现在和未来变化的命名历史。

\n

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

\n

实际上,.502毫秒,而不是微秒

\n

不,日期是在前面的,2021-08-032021 年 8 月 3 日。

\n

T日期部分与时间部分分开。第三部分是 的偏移量-07:00

\n

代码

\n

你说:

\n
\n

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

\n
\n

您正在使用可怕的日期时间类,这些类几年前已被java.time中定义的现代java.time类取代。切勿使用、、等。DateCalendarSimpleDateFormat

\n

用于OffsetDateTime表示具有特定时间的日期(与UTC 的偏移量)

\n

如果您的输入包含可选的冒号,我们可以简单地这样做:

\n
String input = "2021-08-03T04:10:07.502-07:00" ;\nOffsetDateTime odt = OffsetDateTime.parse( input ) ;\n
Run Code Online (Sandbox Code Playgroud)\n

如果没有冒号,我们必须指定格式模式。DateTimeFormatter我们可以使用 来构建一个对象DateTimeFormatterBuilder

\n
DateTimeFormatter f = \n    new DateTimeFormatterBuilder()\n    .parseLenient()\n    .append( DateTimeFormatter.ISO_LOCAL_DATE_TIME )\n    .appendPattern( "xx" )\n    .toFormatter()\n;\n
Run Code Online (Sandbox Code Playgroud)\n

使用该格式化程序。

\n
OffsetDateTime odt = OffsetDateTime.parse( input , f ) ;\n
Run Code Online (Sandbox Code Playgroud)\n
\n

odt.toString(): 2021-08-03T04:10:07.502-07:00

\n
\n

嗯,该代码有效。但理想的解决方案是说服数据发布者使用完整的 ISO 8601 格式,包括每个偏移量中的冒号。

\n