Это правильное время?
Я получаю следующую строку 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 часа вы можете найти его в своей системе.