将包含毫秒的 CIM_DateTime 解析为 Java 日期

2023-12-06

我正在尝试将从 Windows 管理界面检索到的 DateTime 值转换为 Java (1.7) 日期;最终到纪元以来的毫秒数。这格式在这里指定.

我试图解析的一个例子是20160513072950.782000-420这是 2016 年 5 月 13 日 07:29:50 加 782 毫秒,在我的本地时区(-420 分钟 = UTC-7 小时)。小数点后的数字是秒的小数部分;理论上最多 6 位微秒,但实际上只有前 4 位非零。

我最初尝试使用简单日期格式指定我想要解析的三位数毫秒:

SimpleDateFormat cimDateFormat = new SimpleDateFormat("yyyyMMddHHmmss.SSS");
Date date = cimDateFormat.parse(s, new ParsePosition(0));

我的理由是指定毫秒的三位数SSS将停止解析。不幸的是,这并没有奏效;在上面的示例中添加了超过 782 毫秒的时间。

我最终通过将字符串修剪为所需的字符来使其按预期工作:

SimpleDateFormat cimDateFormat = new SimpleDateFormat("yyyyMMddHHmmss.S");
Date date = cimDateFormat.parse(s.substring(0, 18), new ParsePosition(0));

在本例中,我只包含了一个S几毫秒,但它解析了所有三个。

我在其中找不到任何内容SimpleDateFormatjavadoc 清楚地解释了解析结束时发生的情况。具体问题:

  1. 为什么它不断解析超过指定位数的数字SSS case?
  2. 为什么单S解析所有 3 毫秒的数字?
  3. 除了像我一样截断字符串之外,还有其他方法可以告诉SimpleDateFormat在指定位置停止解析字符串?

修改输入

据我所知,Java 的三个常见日期时间框架(旧的捆绑 java.util.Date/.Calendar/java.text.SimpleDateFormat 类、Joda-Time 框架或构建的 java.time 框架)都没有Java 8 及更高版本中)允许将相对于 UTC 的偏移量作为总分钟数。

正如建议的索蒂里奥斯·德利马诺利斯,您必须修改与 UTC 的偏移量将总分钟数转换为标准的小时数和分钟数(以及秒数 - 这种奇怪的 Microsoft 格式会忽略这种可能性)。所以-420应该成为-07:00 or -07:00:00.

java.time

您正在使用与最早版本的 Java 捆绑在一起的麻烦的旧日期时间类。旧的类现在已成为遗产,并已被新的类所取代。java.timeJava 8 及更高版本中内置的框架,并且很大程度上由 ThreeTen-Backport 向后移植到 Java 6 和 7项目及进一步适配安卓.

java.time 类的分辨率为纳秒,最多九位秒的小数部分。因此,处理您输入的 4-6 位小数秒没有问题。

我们的策略分为两部分:(a) 修改输入以转换相对于 UTC 的偏移量,以及 (b) 将修改后的输入字符串解析为日期时间对象。

修改输入

首先我们改变输入20160513072950.782000-420 to 20160513072950.782000-07:00:00。我们通过提取后面的字符来做到这一点+ or -, the 420在这种情况下。

// Modify the input to replace offset as a number of minutes to the standard format, a number of hours, minutes, and seconds.
String input = "20160513072950.782000-420";
String offsetInMinutesAsString = input.substring ( 22 );

将其转换为long,并创建一个LocalTime对象,以便我们可以生成格式为的字符串HH:mm:ss.

long offsetInMinutes = Long.parseLong ( offsetInMinutesAsString );
LocalTime offsetAsLocalTime = LocalTime.MIN.plusMinutes ( offsetInMinutes );
String offsetAsString = offsetAsLocalTime.format ( DateTimeFormatter.ISO_LOCAL_TIME );

将这些尾随字符替换为我们生成的字符串。

String inputModified = ( input.substring ( 0 , 22 ) + offsetAsString );

将字符串解析为日期时间对象

定义一个自定义格式模式通过它将该字符串解析为OffsetDateTime object.

// Parse the modified input as an OffsetDateTime.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "yyyyMMddHHmmss.SSSSSSZZZZZ" , Locale.US );
OffsetDateTime odt = OffsetDateTime.parse ( inputModified , formatter );

转储到控制台。

System.out.println ( "input: " + input + " | inputModified: " + inputModified + " | odt: " + odt );

输入:20160513072950.782000-420 |输入修改:20160513072950.782000-07:00:00 | ODT: 2016-05-13T07:29:50.782-07:00

Convert

我强烈建议避免使用旧的日期时间类。但如果你必须使用java.util.Date对象与旧的日期时间代码进行互操作,您可以进行转换。

寻找添加到旧类中的新方法以进行转换。对于此转换,我们使用java.util.Date.from。我们需要为该转换方法提供一个Instant对象,UTC 时间轴上的一个时刻,分辨率为纳秒。我们可以从我们的OffsetDateTime.

Instant instant = odt.toInstant();
java.util.Date utilDate = java.util.Date.from( instant );

有关转换的更多信息,包括漂亮的图表,请参阅我的答案到另一个问题。请记住,我们仅与与 UTC 的偏移量在我们的输入字符串和我们的OffsetDateTime,不是完整的时区。 A时区是一个偏移量plus处理夏令时 (DST) 等异常的规则。这俩Instantjava.util.Date采用 UTC(偏移量为零)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将包含毫秒的 CIM_DateTime 解析为 Java 日期 的相关文章

随机推荐

  • 如何在 SQL Server 2017 中对简单 Json 数组执行Where子句?

    假设我的数据库中有一个名为attributes以具有此值为例 pages Page1 我怎样才能做一个where子句 以便我可以过滤掉其中包含 Page1 的行 select JSON QUERY Attributes pages from
  • 第一次没有创建数据库

    如何使用EF6重新创建数据库 我已经尝试过以下两篇文章 但是 我不知道为什么它不起作用并出现相同的错误 如何在不使用更新数据库的情况下生成启用了迁移的 EF6 数据库 已为上下文启用迁移 但数据库不存在或不包含映射表 我已经在网络服务器上发
  • 使用 AR(1) 项进行 OLS 估计

    由于我无法解释的原因 因为我不能 不是因为我不想 我办公室使用的流程需要在 Eviews 上运行一些回归 Eviews 上使用的方程规范为 dependent variable c independent variable ar 1 此外
  • OpenCover MSBuild 集成 - 未生成结果

    让 OpenCover 在我的机器上工作后 下一步是让它与构建服务器一起工作 我一直在尝试将 OpenCover 与 Bamboo Build Server 上的 MSBuild 集成 我已按如下方式修改了 Build proj 以在构建解
  • Laravel 5 中的加密和解密

    我一直在寻找有关在 Laravel 中加密和解密值的想法 例如 VIN 号 员工 ID 卡号 社会保障号等 最近在 Laravel 网站上发现了这一点 https laravel com docs 5 6 加密 我的问题是 如何在刀片模板上
  • imshow() 将灰色图像显示为白色图像

    我计算了一个值在 0 到 255 之间的图像 当我使用 imageview 时 图像以灰度正确显示 但是当我想保存该图像或用 imshow 显示它时 我有一个白色图像 或者有时到处都有一些黑色像素 而使用 imageview 时 有人能帮我
  • YT 未定义 - 未捕获的 ReferenceError:[youtube api]

    删除了不需要的代码演示 嘿 我正在实现 Youtube Video Player Api 我在控制台中看到某种错误 视频如何完美播放 但我想知道为什么会出现错误 如果我将代码保留在骨架模式之外 就不会出现任何错误 有人可以解释一下吗 Tha
  • 具有自定义列渲染器排序的 Rally 网格

    背景 当我尝试按使用自定义渲染器的列进行排序时 没有任何反应 它将排序从 ASC 更改为 DESC 来回更改 但数据的顺序从未改变 我假设这是因为没有定义如何对我使用自定义渲染器操作的数据进行排序 但我似乎找不到向列添加排序器或排序函数的方
  • Chrome 放弃了 Java 支持

    我在我的应用程序中使用 Java 小程序 今天我惊讶地看到了redirect来自我的页面和来自 java 的下一条消息 In details我读过有关 Chrome 放弃 NPAPI 支持的报道 最近 谷歌修改了他们的计划 现在声明他们计划
  • 有没有可以将数字拼音转换为带有声调标记的拼音的库?

    只是想知道是否有人知道可以将汉语拼音转换为声调的类库 例如 nin2 hao3 ma 到 n n h o ma 它会类似于这个答案 但希望使用 NET 框架 这是我对 Greg Hewgill 的移植蟒蛇算法到 C 到目前为止我还没有遇到任
  • 刚开始学习Java。为什么 main() 位于类内部?

    我正在学习 Java 我注意到main 被放在一个类中 为什么 我不考虑我的main 成为任何对象的成员 所以请告诉我如何解决这个问题 我不考虑我的main 成为任何对象的成员 这不是因为它是一个static方法 它不属于任何对象 而是属于
  • 在法国机器上执行时出现 java.lang.NumberFormatException

    在下面的代码中 在解析值时 有时我会在法国机器上遇到 NumberFormat 异常 double txPower DecimalFormat df new DecimalFormat txPower txPower getDeltaP l
  • 在 Windows 主机上调试 VMWare 中的 Linux 内核

    我正在开发我的第一个内核模块 所以我对此有点陌生 我的模块偶尔会产生恐慌 并且我无法使用 printk 深入了解它 据我所知 我的调试选项是 1 找到生成的OOPS消息并使用ksymoops or 2 尝试使用 kgdb 进行远程调试 我正
  • JOptionPane 每行有多个按钮?

    我将如何展示JOptionPane showinputDialog 与多个JButtons每行 我不是在谈论Yes No Cancel按钮但有多个自定义标签JButtons显示在内容区域JOptionPane showinputDialog
  • UWP:如何获取任务栏高度

    我正在制作一个 UWP 应用程序 我的要求是以编程方式获取任务栏的大小 该应用程序将在不同分辨率的平板电脑上运行 在遵循 stackoverflow 上的许多答案 实际上与隐藏 显示任务栏更相关 之后 我得到了这个 如何获取任务栏的位置和大
  • unordered_map::iterator 从哪里来?

    当我使用std unordered map
  • 获取保存在挂钩函数中的订单项元中的自定义字段值

    我可以在产品页面上添加 验证 显示在购物车和结帐页面上的自定义字段 请有人告诉我如何使用以下命令检索自定义字段值woocommerce order status completed 已完成 hook 我想在确认电子邮件发送给用户后再发送一封
  • 使用 Weblogic 10.3 记录 JPA SQL

    通过查看 Open JPA 网站 我发现我可以使用以下命令记录生成的 SQL
  • 什么是“Microsoft C++ 异常”?

    这主要是出于好奇 但在调试时 我经常看到这样的一行 MyApp exe 中 0x7583812f 处的第一次机会异常 Microsoft C 异常 内存位置 0x039be09c 处的 CTBadSupportFileException 我
  • 将包含毫秒的 CIM_DateTime 解析为 Java 日期

    我正在尝试将从 Windows 管理界面检索到的 DateTime 值转换为 Java 1 7 日期 最终到纪元以来的毫秒数 这格式在这里指定 我试图解析的一个例子是20160513072950 782000 420这是 2016 年 5