Я пытаюсь проанализировать заголовки дат в электронных письмах.
Иногда электронные письма имеют этот заголовок даты:
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?
@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.
кстати, у меня было одно свидание a.d. VII Kal. Iulias MMDCCLXX a.u.c., я не буду серьезно его разбирать :-D
И на этой странице написано, что сейчас время Юты: timeanddate.com/time/zone/usa/utah Поэтому мы не можем сказать вам, какой часовой пояс вы получаете.
@marstran Я думаю, использование UT в качестве часового пояса Юты может иметь национальное значение. Возможно, именно поэтому JDK лучше не смеет поднимать из-за этого шум.
Я попробовал и проанализировал дату, используя new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);, чтобы проверить национальное понимание часового пояса Юты, к сожалению, ее невозможно проанализировать. Если его можно было проанализировать, UT подтвердил, что это часовой пояс Юты. Эта попытка не доказала ни Юту, ни UTC.
«ЮТ» здесь даже не указано . Кстати, у Юты нет своего тз, там используется US/Mountain (MST/MDT). Соответствующим идентификатором часового пояса IANA tz db будет «Америка/Денвер». Еще один пример того, почему аббревиатуры tz — боль программистов.
@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. (эбенда)
хм, да, но это UTC, а не «UT» ^^ — не путать с UT1.
@FObersteiner действительно твое право. Прямого списка он не указан. Но как-то косвенно оно указано.
Сокращения часовых поясов пугающе часто двусмысленны. UTтоже.
Что бы ты не делал. не используйте SimpleDateFormat. У этого класса были серьезные проблемы с дизайном, и он устарел уже 10 лет. Используйте java.time, современный API даты и времени Java, и его DateTimeFormatter.




Что означает «ЮТ»?
Скорее всего "всемирное время". Но не придирайтесь ко мне, кто-нибудь действительно может выпустить приложение, в котором сейчас «время Юты»* (пожалуйста, не делайте этого). В конце концов, часовые пояса - это политический вопрос...
«Всемирное время» следует называть Всемирным координированным временем/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 будет «Америка/Денвер».
Поиск в Google показывает, что «UT» — это часовой пояс Юты, то есть UTC -7. Так что нет, вы получите неправильное время, если просто перепишете UT на UTC.