从 Joda 时间库迁移到 Java 时间(Java 8)

2024-02-27

我正在尝试从 Joda 时间库迁移到 Java 时间(Java 8)。 我无法找到相当于ISODateTimeFormat.dateOptionalTimeParser() in java.time

Joda ISO 格式化程序有很好的解析器:

ISODateTimeFormat.dateTimeParser():generic - 根据解析的字符串选择解析器。 相似地:ISODateTimeFormat.dateOptionalTimeParser().

我发现很难将 Joda 时间更改为 java.time。 有人可以指导我吗?

例子:

String dateTimeString = "2015-01-01T12:29:22+00:00"; 
String dateTimeString2 = "2015-01-01T12:29:22";

当我使用 joda 时间解析这个字符串时

ISODateTimeFormat.dateTimeParser().withZone("EST")

可以处理两者没有问题。 java 时间中哪个相当​​于这个?

使用 java 8,ZonedDateTime 和 ISO_Zoned_date_time 无法同时处理两者。


您不能使用预定义的格式化程序,但可以使用以下模式构造自己的格式化程序(并将其分配给静态常量):

static final DateTimeFormatter DATE_TIME_OPTIONAL_OFFSET =
    DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss[xxx]");

注意力:如果您解析仅包含日期和时间但没有偏移量(并且没有任何偏移量/区域默认值)的输入,那么结果只能是LocalDateTime,不是全局时间戳。

另请注意方法的不同行为withZone(...).

乔达时间

When parsing, this zone will be set on the parsed datetime.     
A null zone means of no-override. If both an override chronology
and an override zone are set, the override zone will take precedence
over the zone in the chronology.

Java-8 (JSR-310)

When parsing, there are two distinct cases to consider.
If a zone has been parsed directly from the text, perhaps because 
DateTimeFormatterBuilder.appendZoneId() was used, then this override Zone
has no effect. If no zone has been parsed, then this override zone will
be included in the result of the parse where it can be used to build
instants and date-times.

旁注:Joda 时间方法withOffsetParsed()更接近 Java-8 行为。

Update:我现在已经做了自己的测试。查看有时令人惊讶的结果。

System.out.println(System.getProperty("java.version")); // 1.8.0_31

// parsing s1 with offset = UTC
String s1 = "2015-01-01T12:29:22+00:00"; 

OffsetDateTime odt1 = DATE_TIME_OPTIONAL_OFFSET.parse(s1, OffsetDateTime::from);
System.out.println(odt1); // 2015-01-01T12:29:22Z --- OK

LocalDateTime ldt1 = DATE_TIME_OPTIONAL_OFFSET.parse(s1, LocalDateTime::from);
System.out.println(ldt1); // 2015-01-01T12:29:22 --- OK

ZonedDateTime zdt1 = DATE_TIME_OPTIONAL_OFFSET.withZone(ZoneId.of("America/New_York")).parse(s1, ZonedDateTime::from);
System.out.println(zdt1); // 2015-01-01T12:29:22-05:00[America/New_York] --- seems to be a bug compared with the spec above, the parsed offset was overridden!!!

// now parsing s2 without offset
String s2 = "2015-01-01T12:29:22";

OffsetDateTime odt2 = DATE_TIME_OPTIONAL_OFFSET.parse(s2, OffsetDateTime::from);
System.out.println(odt2); // 2015-01-01T12:29:22Z --- questionable, the offset Z is invented/guessed here

LocalDateTime ldt2 = DATE_TIME_OPTIONAL_OFFSET.parse(s2, LocalDateTime::from);
System.out.println(ldt2); // 2015-01-01T12:29:22 --- OK

DATE_TIME_OPTIONAL_OFFSET.withZone(ZoneId.of("America/New_York")).parse(s2, ZonedDateTime::from);
// throws an exception --- seems to be a bug compared with the spec above, the zone set was not accepted

结论:

迁移时我会小心。细节决定成败。也许较新的 Java 版本 8u40 同时纠正了一些显示的问题(至少是withZone()可能已更正 - 请参阅JDK 问题 8033662 https://bugs.openjdk.java.net/browse/JDK-8033662,但对于 8u31,向后移植修复似乎丢失了?!)。您还应该注意,在我的测试中,标记为“EST”的“时区”已被“America/New_York”替换,因为“EST”不是可识别的时区 ID(它是美国本地化的时区名称缩写)。

更新-最终解决方案

经过额外测试后,此代码似乎可以在 Java 8u31 中工作(假设 UTC 作为默认值,以防输入中缺少偏移量):

static final DateTimeFormatter DATE_TIME_OPTIONAL_OFFSET =
    DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss[xxx]");      
OffsetDateTime odt = 
  DATE_TIME_OPTIONAL_OFFSET.withZone(ZoneOffset.UTC).parse(input, OffsetDateTime::from);
ZonedDateTime zdt = odt.toZonedDateTime(); // containing a fixed offset
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Joda 时间库迁移到 Java 时间(Java 8) 的相关文章

随机推荐

  • PHP和2多维数组基于两个键值进行比较

    我有两个像这样的多维数组 original Array 0 gt Array time gt 1364690340 memberid gt 90 type gt single 1 gt Array time gt 1364690341 me
  • 在不使用 CAP_FIRST 的情况下将列中多个单词的首字母大写

    我有一张如下表 Name firstname lastname FirstName Lastname firstName Lastname FirstName lastname 我正在尝试将每个字母大写firstname and lastn
  • 如何使用 Zend DB 执行 MySQL IN 子句?

    我正在尝试使用 Zend Framework 1 11 获取整数数组中的行 this gt dbSelect gt from table prefix product link gt joinLeft table prefix produc
  • Qt如何连接rubberBandChanged信号

    我尝试将 QChartView 类中的 ruby BandChanged 信号链接到 MainWindow 类中的特定函数 主窗口 h class MainWindow public QMainWindow Q OBJECT public
  • Python paramiko 线程安全吗?

    我想在并行执行某些命令时轮询系统状态 例如内存负载或 CPU 负载 我可以在多个 Python 线程中使用一个 Paramiko 客户端还是必须连接多个 Paramiko 客户端 我找不到任何有关 Paramiko 线程安全的文档 感谢您的
  • System.getProperty("os.arch") 在 M1 Mac 上的价值?

    有什么价值System getProperty os arch 返回运行的 Apple Silicon M1 Macaarch64JDK 的端口 例如Liberica https bell sw com端口 即not使用罗塞塔2 基于thi
  • 从已知点对照片进行白平衡

    白平衡是一个相当广泛的主题 但我看到的大多数答案都涵盖了整个图像的自动白平衡技术 该技术没有已知的白色 灰色和黑色点 我似乎找不到很多从已知点涵盖白平衡的内容 我有一个脚本 如下 它拍摄色卡 Spyder Checkr 48 的图像并返回白
  • 从 GitHub 上的 Pull Request 中删除文件

    我已经在 git 上发出了 Pull 请求 使用 xcodeproj project pbxproj 文件 我的错 那么我可以从创建的 Pull 请求中删除这个文件吗 谢谢 您可能会在 master 上合并这个拉取请求 这样你就可以从mas
  • 捕获 R 输出并替换为 LaTeX 代码

    我正在尝试捕获一些 R 代码的输出并将其替换为乳胶代码 如果您运行此代码 library stargazer x lt capture output stargazer mtcars 1 5 1 3 summary FALSE title
  • 如何获取弹性搜索中嵌套对象的数组计数

    有人可以帮助我获取弹性搜索中嵌套对象的聚合计数 假设我的弹性搜索对象映射为 employe dynamic strict properties empId type keyword entities type nested 实体是带有其他对
  • 防止文本表突出显示

    我有一个表 我允许用户 选择 多行 这一切都是使用 jQuery 事件和一些 CSS 来处理的 以直观地指示该行已被 选择 当用户按下 Shift 键时 可以选择多行 有时这会导致文本突出显示 有什么办法可以防止这种情况发生吗 CSS3 有
  • 什么是静态嵌套类? [复制]

    这个问题在这里已经有答案了 可能的重复 Java 静态内部类与非静态内部类 https stackoverflow com questions 1353309 java static vs non static inner class 什么
  • OS X 上的 Pthread 和 gcc 编译问题

    我有一个脚本可以在 Linux Ubuntu 11 04 上编译良好 但不能在 OS X Lion 上编译 gcc pthread o hw1 hw1 c hw1 c 22 error expected asm or attribute b
  • 线程 6,RECV TLSv1 警报:致命,握手失败

    这段代码有什么问题 它应该信任所有主机 但事实并非如此 例如 它可以在 google com 上正常运行 但不能在我的计算机上本地运行的 API 网关服务上运行 为什么 SSL 调试输出 触发 SecureRandom 的播种 完成播种 S
  • 通过 istringstream 进行 C++ 字符串标记化的性能开销

    我想知道性能开销是多少 string line word while std getline cin line istringstream istream line while istream gt gt word parse word h
  • Cordova/phonegap 跟踪应用程序通过 Facebook SDK 安装

    相关问题 如何在 Phonegap Cordova 项目中实施 Facebook 移动安装广告跟踪 https stackoverflow com questions 20305956 我有一个有效的 cordova phonegap 应用
  • 在groovy中动态执行代码

    我正在尝试在 groovy 中动态运行代码 我有someNode 0 这是变量中的值var1 然后我像这样添加双引号 var2 var1 然后我尝试运行这个 request abc var2 Value I saw here https s
  • 如何在 Swift 中返回 Array 的前 5 个对象?

    在 Swift 中 是否有一种巧妙的方法可以使用 Array 上的高阶方法来返回前 5 个对象 obj c 的做法是保存一个索引 然后通过数组循环递增索引 直到索引为 5 并返回新数组 有没有办法做到这一点filter map or red
  • 检查 URL 是否包含我已单击的链接的 href

    在列表中我有一些链接 ul class dropdowner li a href black Black a li li a href white White a li li a href blue Blue a li ul 我的另一个输出
  • 从 Joda 时间库迁移到 Java 时间(Java 8)

    我正在尝试从 Joda 时间库迁移到 Java 时间 Java 8 我无法找到相当于ISODateTimeFormat dateOptionalTimeParser in java time Joda ISO 格式化程序有很好的解析器 IS