代码之家  ›  专栏  ›  技术社区  ›  Atihska

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

  •  0
  • Atihska  · 技术社区  · 2 年前

    我遇到了时区为的日期格式 GMT 但我不明白在上面的日期中,微秒后的连字符部分是什么,以及它的格式是什么来解析这两种方式?

    所以对于这个日期(不带连字符): "2021-08-03T04:10:07.502" ,格式为 YYYY-MM-dd'T'HH:mm:ss.SS

    问题1: 对于这个日期(带连字符): "2021-08-03T04:10:07.502-0700" ,格式为:??

    问题2: 连字符部分是时区吗 格林尼治标准时间 ?

    问题3: 如果日期在微秒后以连字符形式出现,如何添加X个数字来处理它?

    Java代码:

    String dateFormatWithHyphen = "?"; // replace ? with that format
    DateFormat dateFormat = new SimpleDateFormat(dateFormatWithHyphen);
    dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
    return dateFormat;
    
    1 回复  |  直到 2 年前
        1
  •  3
  •   Basil Bourque    2 年前

    tl;博士

    输入字符串的图表,包含日期、分隔符、一天中的时间和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偏移小时和分钟之间的可选冒号字符。我建议始终使用冒号,以便在机器中实现最大的兼容性。而冒号也让人类更容易阅读。所以用这个:

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

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

    前面的连字符 0700 表示七小时的偏移量为 在…的后面 UTC的时间本初子午线。

    - -07:00 在美洲,指的是比UTC晚7小时。

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

    实际上,UTC是新的GMT,适用于常见的以业务为导向的情况。如果你在做火箭科学或GPS/Galileo卫星计算,你应该研究两者之间的差异。如果您正在为采购订单和发票编程,不要担心。

    关于你的说法,时区GMT是矛盾的。UTC/GMT是 A. time zone 它是定义偏移量的基准:一定的时分秒数。经度是多少 prime meridian ,偏移量为UTC。时区要多得多。 Time zones 是一段命名的历史,记录了过去、现在和未来的变化,这些变化是由政治家决定的,由特定地区的人民使用的补偿。

    问题3:如果日期在微秒后以连字符形式出现,如何添加X个数字来处理它?

    事实上 .502 milliseconds microseconds .

    不,日期是提前的 2021-08-03 部分,2021年8月3日。

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

    密码

    你说:

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

    你使用的是几年前被现代社会取代的糟糕的约会时间类 JAVA时间 中定义的类 JAVA时间 .永远不要使用 Date , Calendar , SimpleDateFormat 等等。

    使用 OffsetDateTime 用一天中的时间表示一个日期 offset-from-UTC .

    如果您的输入包含可选的冒号,我们可以简单地执行以下操作:

    String input = "2021-08-03T04:10:07.502-07:00" ;
    OffsetDateTime odt = OffsetDateTime.parse( input ) ;
    

    如果没有冒号,我们必须指定格式模式。我们可以建立一个 DateTimeFormatter 通过使用 DateTimeFormatterBuilder .

    DateTimeFormatter f = 
        new DateTimeFormatterBuilder()
        .parseLenient()
        .append( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
        .appendPattern( "xx" )
        .toFormatter()
    ;
    

    使用格式化程序。

    OffsetDateTime odt = OffsetDateTime.parse( input , f ) ;
    

    奥德特。toString():2021-08-03T04:10:07.502-07:00

    好吧,那代码行得通。但理想的解决方案是说服数据发布者使用完整的ISO 8601格式,包括每个偏移量中的冒号。