Это правильное время?

Я получаю следующую строку datetime из бэкэнд-системы: 2014-06-10+02:00,

Это действительная дата и время? Нет информации о времени (я получаю только дату), но есть смещение времени.

Если он действителен в соответствии с каким стандартом, он действителен и в какое время UTC?

большое спасибо

4 ответа

Это действительная дата, а не дата-время.

Смещение от UTC относится к дате. В любой момент времени дата меняется по всему земному шару в зависимости от часового пояса. Например, через несколько минут после полуночи в Париже Франция - новый день, а в Монреале-Квебеке все еще "вчера".

Кстати, смещение от 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 );  

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

Вывод является действительной датой, но не действительным временем согласно спецификации даты ISO. Пожалуйста, смотрите ISO_OFFSET_DATE.

UTC (Всемирное координированное время) - это стандарт времени, определенный Международным союзом электросвязи.

Если он действителен, в соответствии с каким стандартом он действителен и какое время UTC?

Вы задали три вопроса в этой строке, и ответ на эти вопросы следующий:

Это действительно так?

Да, это допустимая строка даты.

Вы уже упомянули в своем вопросе, что у него нет временной части; скорее, он имеет смещение часов (часовой пояс). Итак, это просто допустимая строка даты, а не строка даты и времени.

Какой это стандарт?

Это ISO 8601.

Какое время UTC?

Дата начинается с начала дня, которое в большинстве случаев является часами. Однако для часовых поясов, в которых соблюдается летнее время , это может быть не так. Такие часовые пояса обычно имеют разницу в смещении часового пояса в один час между с и без DST.

Ваша строка имеет фиксированное смещение (часовой пояс) ( +02:00); а не сам часовой пояс (например, Africa/Cairo) и, следовательно, в этом случае начало дня всегда 00:00 часы.

Итак, это можно записать как 2014-06-10'T'00:00:00+02:00. Как только вы представляете это таким образом, я уверен, вы уже догадались, что это эквивалентно 2014-06-09'T'22:00:00Z где Z- указатель часового пояса для смещения нулевого часового пояса. Это расшифровывается как 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

Узнайте больше о современном API даты и времени* из Trail: Date Time .


* По любой причине, если вам нужно придерживаться Java 6 или Java 7, вы можете использовать ThreeTen-Backport, который поддерживает большую часть функциональности java.time для Java 6 и 7. Если вы работаете над проектом Android и своим Android API уровень по-прежнему не соответствует Java-8, проверьте API-интерфейсы Java 8+, доступные через десугаринг, и Как использовать ThreeTenABP в Android Project .

Да, это правильный формат даты. Есть много места, где вы можете найти jerusalam.. и т. д. +2 часа вы можете найти его в своей системе.

Другие вопросы по тегам