首页 >Java >java教程 >为什么我的 SimpleDateFormat 无法解析日期,如何使用 Locale 和 DateTimeFormatter 修复它?

为什么我的 SimpleDateFormat 无法解析日期,如何使用 Locale 和 DateTimeFormatter 修复它?

Susan Sarandon
Susan Sarandon原创
2024-12-29 11:21:14942浏览

Why Does My SimpleDateFormat Fail to Parse Dates, and How Can I Fix It Using Locale and DateTimeFormatter?

始终使用 SimpleDateFormat 指定区域设置,并为自定义格式指定 DateTimeFormatter

问题:

解析日期-使用 SimpleDateFormat 的时间字符串在特定设备上失败,导致“无法解析的日期”错误。

分析:

SimpleDateFormat 需要一个 Locale 参数来指定日期解析的语言和文化约定。如果未指定区域设置,则使用系统的默认区域设置。这可能会导致在具有不同区域设置的设备上解析不一致。

解决方案:

  1. 在创建 SimpleDateFormat 实例时显式指定所需的区域设置。
  2. 使用现代的 DateTimeFormatter API 代替 SimpleDateFormat。 它提供了特定于语言环境的解析和格式化,提高了性能和灵活性。

详细说明:

给定日期-时间字符串(“24 Oct 2016 7:31 pm”)是英文的。但是,如果系统的默认 Locale 不是英语(例如,法国电话),默认的 SimpleDateFormat 实例将无法解析它。

Java 8 (DateTimeFormatter):

在 Java 8 中,使用具有显式 Locale 的 DateTimeFormatter 来解析自定义日期时间字符串。避免使用预定义的格式化程序,它们不接受区域设置。例如:

DateTimeFormatter dtf = new DateTimeFormatterBuilder()
        .parseCaseInsensitive()
        .appendPattern("d MMM uuuu h:m a")
        .toFormatter(Locale.ENGLISH);
LocalDateTime ldt = LocalDateTime.parse(strDateTime, dtf);

Java 6/7 (ThreeTen-Backport):

如果无法使用 Java 6 或 Java 7,请使用 ThreeTen-Backport 向后移植DateTimeFormatter 功能。

其他注意:

  1. 错误消息“Unparseable date: "24 Oct 2016 7:31 pm" (at offset 3)”表示解析失败,因为第二个字符(“c”) )位于“Oct”(偏移量 3 处的字符)。这可能是由于月份名称中特定于区域设置的差异造成的。
  2. 强烈建议切换到现代 DateTimeFormatter API 来进行所有日期时间处理,因为它在功能、性能和一致性方面更优越与 SimpleDateFormat 相比。

以上是为什么我的 SimpleDateFormat 无法解析日期,如何使用 Locale 和 DateTimeFormatter 修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn