这是一个有效的时间吗?

时间:2017-05-02 12:50:08

标签: date datetime time datetime-format datetimeoffset

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

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

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

非常感谢

4 个答案:

答案 0 :(得分:3)

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

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 );  

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

<块引用>

如果根据哪个标准有效,这个有效,什么是有效的 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。它代表祖鲁语并指定 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

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


* 出于任何原因,如果您必须坚持使用 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

答案 3 :(得分:-1)

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