Можно ли переписать неподдерживаемый часовой пояс UT на UTC?

Я пытаюсь проанализировать заголовки дат в электронных письмах.

Иногда электронные письма имеют этот заголовок даты:

Mon, 18 Jul 2011 05:05:53 UT

Похоже на формат, описанный в javadoc.

Поэтому я написал для этого тест:

public void testParser() throws ParseException {
    SimpleDateFormat FULL_FORMAT = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
    try {
        String baddate = "Mon, 18 Jul 2011 05:05:53 UT";
        System.out.println("NOW: " + FULL_FORMAT.format(new Date()));
        System.out.println("THEN: " + FULL_FORMAT.parse(baddate + "C"));
        System.out.println("---");
        System.out.println(FULL_FORMAT.parse(baddate));
    } catch (Exception e) {
        e.printStackTrace(System.out);
    }
    System.out.println("UTC: " + TimeZone.getTimeZone("UTC"));
    System.out.println("UT: " + TimeZone.getTimeZone("UT"));
}

И это результат:

[INFO] Running de.e_nexus.web.rm.mail.TestDateParser
NOW: Thu, 29 Feb 2024 11:50:52 +0100
THEN: Mon Jul 18 07:05:53 CEST 2011
---
java.text.ParseException: Unparseable date: "Mon, 18 Jul 2011 05:05:53 UT"
    at java.base/java.text.DateFormat.parse(DateFormat.java:399)
    at de.e_nexus.web.rm.mail/de.e_nexus.web.rm.mail.TestDateParser.testParser(TestDateParser.java:17)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.apache.maven.surefire.junit.PojoTestSetExecutor.executeTestMethod(PojoTestSetExecutor.java:104)
    at org.apache.maven.surefire.junit.PojoTestSetExecutor.execute(PojoTestSetExecutor.java:63)
    at org.apache.maven.surefire.junit.JUnit3Provider.executeTestSet(JUnit3Provider.java:131)
    at org.apache.maven.surefire.junit.JUnit3Provider.invoke(JUnit3Provider.java:93)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
    at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
    at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
UTC: sun.util.calendar.ZoneInfo[id = "UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
UT: sun.util.calendar.ZoneInfo[id = "GMT",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.044 s -- in de.e_nexus.web.rm.mail.TestDateParser

Часовой пояс UT явно существует (может быть похож на UTC или такой же, как UTC), но Java не поддерживает часовой пояс UT.

Можно ли переписать UT в UTC?

Поиск в Google показывает, что «UT» — это часовой пояс Юты, то есть UTC -7. Так что нет, вы получите неправильное время, если просто перепишете UT на UTC.

marstran 29.02.2024 12:05

@marstran Я читаю здесь Academickids.com/encyclepedia/index.php/…, что UT — это часовой пояс зулу. И For most practical and legal-trade purposes, the fractional difference between UTC and UT (or, GMT) is inconsequentially small, and for this reason UTC is colloquially called GMT sometimes, even if this is not technically correct.

Grim 29.02.2024 12:10

кстати, у меня было одно свидание a.d. VII Kal. Iulias MMDCCLXX a.u.c., я не буду серьезно его разбирать :-D

Grim 29.02.2024 12:14

И на этой странице написано, что сейчас время Юты: timeanddate.com/time/zone/usa/utah Поэтому мы не можем сказать вам, какой часовой пояс вы получаете.

marstran 29.02.2024 12:14

@marstran Я думаю, использование UT в качестве часового пояса Юты может иметь национальное значение. Возможно, именно поэтому JDK лучше не смеет поднимать из-за этого шум.

Grim 29.02.2024 12:20

Я попробовал и проанализировал дату, используя new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);, чтобы проверить национальное понимание часового пояса Юты, к сожалению, ее невозможно проанализировать. Если его можно было проанализировать, UT подтвердил, что это часовой пояс Юты. Эта попытка не доказала ни Юту, ни UTC.

Grim 29.02.2024 12:27

«ЮТ» здесь даже не указано . Кстати, у Юты нет своего тз, там используется US/Mountain (MST/MDT). Соответствующим идентификатором часового пояса IANA tz db будет «Америка/Денвер». Еще один пример того, почему аббревиатуры tz — боль программистов.

FObersteiner 29.02.2024 12:39

@FObersteiner Да, он там указан. Проверьте запись UTC. Universal Time (UT) was created at the International Meridian Conference in 1884. This is the basis for the 24-hour time zone system we know today. (эбенда)

Grim 29.02.2024 12:45

хм, да, но это UTC, а не «UT» ^^ — не путать с UT1.

FObersteiner 29.02.2024 12:49

@FObersteiner действительно твое право. Прямого списка он не указан. Но как-то косвенно оно указано.

Grim 29.02.2024 12:53

Сокращения часовых поясов пугающе часто двусмысленны. UTтоже.

Anonymous 29.02.2024 14:38

Что бы ты не делал. не используйте SimpleDateFormat. У этого класса были серьезные проблемы с дизайном, и он устарел уже 10 лет. Используйте java.time, современный API даты и времени Java, и его DateTimeFormatter.

Anonymous 29.02.2024 14:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
12
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что означает «ЮТ»?

Скорее всего "всемирное время". Но не придирайтесь ко мне, кто-нибудь действительно может выпустить приложение, в котором сейчас «время Юты»* (пожалуйста, не делайте этого). В конце концов, часовые пояса - это политический вопрос...

«Всемирное время» следует называть Всемирным координированным временем/UTC. На сайте timeanddate.com есть краткий обзор основ . Значение «UT» потенциально неясно (это UTC, но не согласовано? Это UT1, и кто-то забыл цифру 1?). Однако его можно найти, например, в документации репозитория базы данных tz IANA (пример ) или в RFC, который описывает формат файла, используемый для предоставления правил tz (пример ). Как и UTC, это означает солнечное время, а не атомное время (TAI). Есть еще пара связанных терминов, см. раздел Этимология UTC в Википедии. TL;DR: используйте «UTC».

Можно ли переписать неподдерживаемый часовой пояс UT на UTC?

Библиотеки даты и времени/часового пояса будут принимать «UTC», но менее вероятно «UT». Так что, возможно, вы захотите заменить его. TL;DR: Вероятно, это безопасно. Можете ли вы быть абсолютно уверены, что сейчас не время Юты? Нет.


*) У Юты нет своего тз, там используется US/Mountain (MST/MDT). Соответствующим идентификатором часового пояса IANA tz db будет «Америка/Денвер».

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