Я абсолютно сбит с толку. Я использую OpenJdk 11.0.3 как локально, так и на моем рабочем хосте. Один разбирает дату, а другой нет. Любые идеи о том, что может быть причиной разницы?
Редактировать: в конце отмечена хакерская работа вокруг
Тот же JDK:
kesselc:~/openjdk-11.0.3+7/bin$ ./java -version
openjdk version "11.0.3" 2019-04-16
OpenJDK Runtime Environment 18.9 (build 11.0.3+7)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.3+7, mixed mode)
prodhost: # java -version
openjdk version "11.0.3" 2019-04-16
OpenJDK Runtime Environment (build 11.0.3+7-Ubuntu-1ubuntu218.04.1)
OpenJDK 64-Bit Server VM (build 11.0.3+7-Ubuntu-1ubuntu218.04.1, mixed mode, sharing)
Различные результаты:
kesselc:$ ~/openjdk-11.0.3+7/bin/java DateTest
2019-07-10T09:48-06:00[America/Denver]
prodhost: # java DateTest
Exception in thread "main" java.time.format.DateTimeParseException: Text '948 AM MDT Wed Jul 10 2019' could not be parsed: null
at java.base/java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:2017)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1952)
at java.base/java.time.ZonedDateTime.parse(ZonedDateTime.java:598)
at DateTest.main(DateTest.java:13)
Caused by: java.lang.NullPointerException
at java.base/java.time.format.DateTimeFormatterBuilder$PrefixTree.prefixLength(DateTimeFormatterBuilder.java:4527)
at java.base/java.time.format.DateTimeFormatterBuilder$PrefixTree.add0(DateTimeFormatterBuilder.java:4396)
at java.base/java.time.format.DateTimeFormatterBuilder$PrefixTree.add(DateTimeFormatterBuilder.java:4391)
at java.base/java.time.format.DateTimeFormatterBuilder$ZoneTextPrinterParser.getTree(DateTimeFormatterBuilder.java:4138)
at java.base/java.time.format.DateTimeFormatterBuilder$ZoneIdPrinterParser.parse(DateTimeFormatterBuilder.java:4249)
at java.base/java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.parse(DateTimeFormatterBuilder.java:2370)
at java.base/java.time.format.DateTimeFormatter.parseUnresolved0(DateTimeFormatter.java:2107)
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2036)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
... 2 more
Вот простой тестовый класс, на котором я работаю:
public class DateTest {
private static final DateTimeFormatter hhmm_a_zzz_EEE_MMM_dd_yyyy = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("hmm a zzz EEE MMM d yyyy")
.toFormatter();
public static void main(String[] args) {
System.out.println(ZonedDateTime.parse("948 AM MDT Wed Jul 10 2019", hhmm_a_zzz_EEE_MMM_dd_yyyy));
}
}
Редактировать: мое решение, своего рода. В этом случае я анализирую прогнозы NOAA, которые конкретно ориентированы на США. Итак, я взломал свой собственный эквивалент ZoneId.of ("MDT"), чтобы сопоставить смещение для 17 часовых поясов, отмеченных здесь: https://www.timetemperature.com/abbreviations/united_states_time_zone_abbreviations.shtml
Я чувствую себя немного грязно и стыдно, но этот конкретный анализатор даты специфичен для этого конкретного источника, поэтому я назову его достаточно хорошим.
Я до сих пор не знаю, почему две системы вели себя по-разному, но теперь проблема не имеет значения.
Вот дамп System.getProperties
на двух системах.
Хорошо (kesselc
):
{sun.desktop = gnome, awt.toolkit = sun.awt.X11.XToolkit, java.specification.version = 11, sun.cpu.isalist =, sun.jnu.encoding = UTF-8, java.class .path =., java.vm.vendor = Oracle Corporation, sun.arch.data.model = 64, java.vendor.url = http://java.oracle.com/, user.timezone =, os.name = Linux, java.vm .specification.version = 11, sun.java.launcher = SUN_STANDARD, user.country = US, sun.boot.library.path = / home / kesselc / .sdkman /андидаты / java / 11.0.2-open / lib, sun .java.command = DateTest, jdk.debug = release, sun.cpu.endian = little, user.home = / home / kesselc, user.language = en, java.specification.vendor = Oracle Corporation, java.version.date = 2019-01-15, java.home = / home / kesselc / .sdkman /андидаты / java / 11.0.2-open, file.separator = /, java.vm.compressedOopsMode = на основе нуля, line.separator =
, java.specification.name = Спецификация API платформы Java, java.vm.specification.vendor = Oracle Corporation, java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment, sun.management.compiler = HotSpot 64-разрядные многоуровневые компиляторы, java. runtime.version = 11.0.2 + 9, user.name = kesselc, path.separator = :, os.version = 4.4.0-154-generic, java.runtime.name = OpenJDK среда выполнения, file.encoding = UTF- 8, java.vm.name = OpenJDK 64-разрядная серверная виртуальная машина, java.vendor.version = 18,9, java.vendor.url.bug = http://bugreport.java.com/bugreport/, java.io.tmpdir = / tmp, java.version = 11.0.2, user.dir = / home / kesselc / Проекты / flex / weather / out / production / classes, os.arch = amd64, java.vm.specification.name = Спецификация виртуальной машины Java, java.awt.printerjob = sun.print.PSPrinterJob, sun.os.patch.level = неизвестно, java.library.path = / usr / java / packages / lib: / usr / lib64: / lib64: / lib: / usr / lib, java.vendor = Oracle Corporation, java.vm.info = смешанный режим, java.vm.version = 11.0.2 + 9, sun.io.unicode.encoding = UnicodeLittle, java.class.version = 55.0}
Сбой (prodhost
):
{awt.toolkit = sun.awt.X11.XToolkit, java.specification.version = 11, sun.cpu.isalist =, sun.jnu.encoding = ANSI_X3.4-1968, java.class.path =. , java.vm.vendor = Oracle Corporation, sun.arch.data.model = 64, java.vendor.url = http://java.oracle.com/, user.timezone =, os.name = Linux, java.vm.specification.version = 11, sun.java.launcher = SUN_STANDARD, user.country = US, sun.boot.library.path = / usr / lib / jvm / java-11-openjdk-amd64 / lib, sun.java.command = DateTest, jdk.debug = release, sun.cpu.endian = little, user.home = / root, user.language = en, java.specification.vendor = Oracle Corporation, java.version.date = 2019-04-16, java. home = / usr / lib / jvm / java-11-openjdk-amd64, file.separator = /, java.vm.compressedOopsMode = 32-разрядный, line.separator =, java.specification.name = Спецификация API платформы Java, java.vm.specification.vendor = Oracle Corporation, java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment, sun.management.compiler = HotSpot 64-разрядные многоуровневые компиляторы, java. runtime.version = 11.0.3 + 7-Ubuntu-1ubuntu218.04.1, user.name = root, path.separator = :, os.version = 4.4.0-1079-aws, java.runtime.name = OpenJDK Runtime Environment, file.encoding = ANSI_X3.4-1968, java.vm.name = OpenJDK 64-битная виртуальная машина сервера, java.vendor.url.bug = http://bugreport.java.com/bugreport/, java.io.tmpdir = / tmp, java.version = 11.0.3, user.dir = / opt / ct / deploy, os.arch = amd64, java.vm.specification.name = Спецификация виртуальной машины Java, java.awt.printerjob = sun.print.PSPrinterJob, sun.os. patch.level = неизвестно, java.library.path = / usr / java / packages / lib: / usr / lib / x86_64-linux-gnu / jni: / lib / x86_64-linux-gnu: / usr / lib / x86_64- linux-gnu: / usr / lib / jni: / lib: / usr / lib, java.vendor = Oracle Corporation, java.vm.info = смешанный режим, совместное использование, java.vm.version = 11.0.3 + 7-Ubuntu -1ubuntu218.04.1, sun.io.unicode.encoding = UnicodeLittle, java.class.version = 55,0} * 1 043 *