当前位置: 首页 > 知识库问答 >
问题:

DateTimeParseException:在一台主机上失败,在另一台相同的JDK上工作

充煌
2023-03-14
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" target="_blank">html

我隐约感到肮脏和羞愧,但这个特定的日期解析器是特定于这个特定源的,所以我认为它足够好了。

我仍然不知道为什么2个系统的行为不同,但现在问题是不相关的。

好(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,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/candidates/java/11.0.2-open,file.separator=/,java.vm.compressedoopsmode=zero,sun.management.compiler=hotspot 64位分层编译器,java.runtime.version=110.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位服务器VM,java.vendor.version=18.9,java.vendor.url.bug=http://bugreport.java.com/bugreport/,java.io.tmpdir=/tmp,java.version=11.0.2,机器规范,java.awt.printerjob=sun.print.psprinterjob,sun.os.patch.level=unknown,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.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.compiler=32位,line.separator=,SPOT 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运行时环境,file.encoding=ansi_x3.4-1968,java.VM.name=OpenJDK 64位服务器VM,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虚拟机a.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/x86_64-linux-gnu://usr/lib/x86_64-linux-gnu://usr/lib/jni:/usr/lib/x86_64-linux-gnu://usr/lib/jni://usr/lib://jni://usr/lib/lib://usr/lib

共有1个答案

端木狐若
2023-03-14

我一直在查看DateTimeFormatterBuilder的源代码,但我很不确定,但在我看来,NullPointerException的可能原因是某些区域设置数据中的空时区缩写。这可能导致datetimeformatterbuilder.zonetextprinterparser.gettree()datetimeformatterbuilder.prefixtree.add()传递一个空值,而这又不需要空值。如果是这样,不同的行为可能是由不同的时区和不同的地点组合造成的。注意,时区和区域设置是独立的。

编辑:提问者报告说,我的建议不能解决这个特定的问题。我之所以让它成立,是因为我认为为解析时区缩写指定首选时区的可能性可能对其他几个时区有所帮助。

我没有复制您的异常,所以不能给出确定的修复方法,但我想建议您尝试:

    Set<ZoneId> preferredZones = Set.of(ZoneId.of("America/Goose_Bay"),
            ZoneId.of("America/Moncton"), ZoneId.of("America/New_York"),
            ZoneId.of("America/Chicago"), ZoneId.of("America/Denver"),
            ZoneId.of("America/Los_Angeles"), ZoneId.of("America/Anchorage"),
            ZoneId.of("Pacific/Honolulu"), ZoneId.of("America/Adak"),
            ZoneId.of("Pacific/Pago_Pago"), ZoneId.of("Pacific/Guam"));
    DateTimeFormatter hhmm_a_zzz_EEE_MMM_dd_yyyy = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .appendPattern("hmm a ")
            .appendZoneText(TextStyle.SHORT, preferredZones)
            .appendPattern(" EEE MMM d yyyy")
            .toFormatter(Locale.US);

首选区域已选定,以匹配您链接到的17个缩写:

AST        America/Goose_Bay, America/Moncton
EST EDT    America/New_York
CST CDT    America/Chicago
MST MDT    America/Denver
PST PDT    America/Los_Angeles
AKST AKDT  America/Anchorage
HST        Pacific/Honolulu
HAST HADT  America/Adak
SST SDT    Pacific/Pago_Pago
CHST       Pacific/Guam

您可能想检查一下我的映射是否正确。

此外,正如其他人已经建议的那样,我为格式化程序指定了locale.us

 类似资料:
  • 我刚刚在wildfly 12服务器上学习ejb remote。我已使用jboss ejb客户端在同一台计算机上成功连接到ejb。使用localhost访问同一JVM时的属性(工作示例): 当我尝试使用127.0.0.1而不是localhost访问同一个ejb时,它等待了很长时间,没有显示任何错误,也没有发生任何事情。这是JBossEJB客户端。使用127.0.0.1在同一JVM上访问服务器时的属性

  • 使用时,保存的图像是独立的,因此图像的大小会变大。(~对于10个图像,大小约为9GB) 在提取docker图像后,我探索: 有没有办法有效地导出图像? 注:我已经提到了这一点。这个问题不是它的重复。它没有解决我上面提到的用例。

  • 问题内容: 如Docker文档中有关使用卷的文档中所述,存在所谓 的仅数据 容器的概念,该容器提供了可以安装到多个其他容器中的卷,无论该数据容器是否正在运行。 基本上,这听起来很棒。但是有一件事我不明白。 这些卷(由于可移植性原因, 未 明确映射到主机上的文件夹,如文档所述)由Docker在主机上的某个内部文件夹中创建和管理。 假设我使用了这样一个卷,然后需要将其从一台主机迁移到另一台主机-如何移

  • 正如Docker有关卷的文档中所述,存在所谓的仅数据容器的概念,它提供了一个可以装入多个其他容器的卷,无论仅数据容器是否实际运行。 基本上,这听起来很棒。但有一件事我不明白。 这些卷(如文档所述,出于可移植性原因,这些卷不会显式映射到主机上的文件夹)由Docker在主机上的某个内部文件夹中创建和管理()。 假设我使用这样一个卷,然后我需要将它从一台主机迁移到另一台主机——我如何移植该卷?AFAIC

  • 这段代码工作正常(并与我们更大的应用程序联系在一起),并为我们的应用程序打开了配置屏幕。 以下是等待空闲方法: 在Windows10机器上,clickOnTable()方法失败,因为方法实际上没有单击选项卡,因此屏幕上没有显示我们要查找的表。 null 更新1 在失败的笔记本电脑和工作的Windows10机器上尝试了不同版本的Java。两者都没有区别。 出现故障的笔记本电脑运行的是Windows

  • 本文向大家介绍Elixir连接同一台机器上的节点,包括了Elixir连接同一台机器上的节点的使用技巧和注意事项,需要的朋友参考一下 示例 在两个终端窗口中启动两个命名节点: 通过指示一个节点连接来连接两个节点: 现在,两个节点已连接并且彼此了解: 您可以在其他节点上执行代码: