【问题标题】:Is this a valid time?这是一个有效的时间吗?
【发布时间】:2017-09-30 00:05:52
【问题描述】:

我从后端系统获得以下日期时间字符串:2014-06-10+02:00

这是一个有效的日期时间吗?没有关于时间的信息(我只得到日期),但有一个时间偏移。

如果根据哪个标准有效,UTC时间是多少?

非常感谢

【问题讨论】:

    标签: date datetime time datetime-format datetimeoffset


    【解决方案1】:

    这是一个有效的日期,而不是日期时间。

    offset-from-UTC 与日期相关。对于任何给定的时刻,日期都会因时区而在全球范围内变化。例如,法国巴黎午夜过后几分钟是新的一天,而魁北克蒙特利尔仍是“昨天”。

    顺便说一下,offset-from-UTC 不是时区。时区是特定区域使用的偏移量的更改历史(过去、现在和未来)。时区的名称格式为continent/region,例如America/Montreal

    通过日期和偏移量,您可以确定当天发生的所有时刻的范围,时间轴上的所有点。

    Java 中的示例代码。

    ZoneOffset offset = ZoneOffset.parse( "+02:00" );
    LocalDate ld = LocalDate.parse( "2014-06-10" ) ;
    OffsetDateTime odt = OffsetDateTime.of( ld , LocalTime.MIN , offset );  
    

    【讨论】:

      【解决方案2】:

      https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

      根据 ISO 日期规范,输出是有效的日期,但不是有效的时间。请参阅 ISO_OFFSET_DATE。

      UTC(协调世界时)是国际电信联盟定义的时间标准。

      【讨论】:

        【解决方案3】:

        如果它是有效的,根据哪个标准是有效的,什么是有效的 UTC 时间?

        您在这一行中提出了三个问题,这些问题的答案如下:

        有效吗?

        是的,它是一个有效的日期字符串。

        您已经在问题中提到它没有时间部分;相反,它的(时区)偏移量为+02:00 小时。所以,它只是一个有效的日期字符串,而不是日期时间字符串。

        这是什么标准?

        这是ISO 8601

        UTC 时间是多少?

        日期从一天的开始时间开始,在大多数情况下,它是00:00 小时。但是,对于遵守DST 的时区,情况可能并非如此。这样的时区在有和没有夏令时的时区偏移量上通常相差一小时。

        您的字符串有一个固定的(时区)偏移量(+02:00);而不是时区本身(例如Africa/Cairo),因此在这种情况下,一天的开始始终是00:00 小时。

        所以,它可以写成2014-06-10'T'00:00:00+02:00。一旦你用这种方式表示它,我相信你一定已经猜到它等同于2014-06-09'T'22:00:00Z,其中Z 是零时区偏移的timezone designator。它代表 Zulu 并指定 Etc/UTC 时区(时区偏移量为 +00:00 小时)。

        废话不多说,让我们写一些代码。

        import java.time.OffsetDateTime;
        import java.time.ZoneOffset;
        import java.time.format.DateTimeFormatter;
        import java.time.format.DateTimeFormatterBuilder;
        import java.time.temporal.ChronoField;
        import java.util.Locale;
        
        public class Main {
            public static void main(String[] args) {
                String str = "2014-06-10+02:00";
        
                DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                                        .appendPattern("u-M-d['T'[H[:m[:s]]]]XXX")
                                        .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
                                        .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
                                        .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
                                        .toFormatter(Locale.ENGLISH);
        
                OffsetDateTime odt = OffsetDateTime.parse(str, dtf);
                System.out.println(odt);
        
                OffsetDateTime odtUtc = odt.withOffsetSameInstant(ZoneOffset.UTC);
                // The default format omits second and fraction-of-second if they are zero
                System.out.println(odtUtc);
                // Custom format
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
                System.out.println(formatter.format(odtUtc));
            }
        }
        

        输出:

        2014-06-10T00:00+02:00
        2014-06-09T22:00Z
        2014-06-09T22:00:00Z
        

        Trail: Date Time 了解有关 modern date-time API* 的更多信息。


        * 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

        【讨论】:

          【解决方案4】:

          是的,它是正确的日期格式。有很多地方 jerusalam..etc 与 +2 小时你可以在你的系统中找到它。

          【讨论】:

          • 问题是关于时间,而不是日期。
          • 您必须同时考虑任何偏移日期的时间和日期,如果您只考虑日期或只考虑时间是错误的,您可以将其解析为日期时间后获取时间。 @Basil Bourque 以更好的方式解释它。
          猜你喜欢
          • 2014-03-25
          • 2016-11-24
          • 2010-11-25
          • 1970-01-01
          • 2012-11-17
          • 2020-03-19
          • 2020-05-29
          • 2016-10-25
          • 1970-01-01
          相关资源
          最近更新 更多