在Java中解析日期的毫秒分数

Posted

技术标签:

【中文标题】在Java中解析日期的毫秒分数【英文标题】:Parsing milliseconds fraction of date in Java 【发布时间】:2015-05-06 21:32:34 【问题描述】:

我正在使用这种模式在 Java 中解析日期(从服务器获取):"yyyy-MM-dd'T'HH:mm:ss.SSS"

传入的字符串可能是以下类型:

2015-01-01T00:00:00.561
2015-01-01T00:00:00.5

我的问题是关于毫秒分数。我无法确定第二个字符串中的.55 还是500 ms。因为当我使用我的模式解析它时,我得到500 ms。看起来不错,但需要仔细检查是否有任何通用合同可以在服务器端修剪这些零。我不会问服务器是否返回了2015-01-01T00:00:00.500,但使用.5 我不确定服务器端5500 是什么。

更新:

我刚刚与服务器团队进行了交谈,他们确认.5.500

【问题讨论】:

服务器是使用相同日期模式的Java程序吗? @KevinKrumwiede 我不知道,这超出了我的能力范围。 看看你能不能把日期输入为2015-01-01T00:00:00.0xx,其中xx是任意2位数字。如果您可以在任何测试用例中找到 0 作为填充,那么您就会知道它是 5 毫秒还是 500 毫秒。 也许该点的行为类似于浮点数中的点?例如,1.51.500 相同。 【参考方案1】:

@dana 有好处:1.5 是 1.500 但是要确保有简单的方法来验证。只需在日志文件中查找一些记录,您就可以轻松查看序列以及这些序列中的毫秒数。 我认为那将是

2015-01-01T00:00:00.46
2015-01-01T00:00:00.5
2015-01-01T00:00:00.561
2015-01-01T00:00:00.57
2015-01-01T00:00:00.678

但不是按照您提供的顺序。 从这个例子中你可以清楚地看到这对于毫秒的含义是相同的。

在一个日志文件中很容易看到它。如果您有更多,那么它们可能来自不同的服务器,您无法比较时间。根据定义,不同的服务器有不同的时间。尤其是以毫秒为单位。 即使日志文件来自同一个盒子但不同的应用程序,从字面上比较时间仍然不是一个好主意。一个日志文件可能会被锁定几毫秒,因此您的时间会有所不同。您所能做的就是从一个来源存档的关系比较(早期/后期)。所有其他情况都可能无效。

【讨论】:

感谢您的帮助! +1。我刚刚和服务器团队谈过,他们确认.5.500【参考方案2】:

ISO 8601

YYYY-MM-DDTHH:MM:SS.SSS±HH:MM 模式是ISO 8601 标准定义的字符串格式。

您的特定用法省略了与UTC 的偏移量(末尾的加号/减号)。如果没有偏移量,则该值是“本地时间”,这意味着它指的是任何地方,例如“圣诞节开始于 2015-12-25T00:00:00”。

Joda-Time 库和java.time package 在生成/解析字符串时都使用 ISO 8601 格式作为默认格式。

小数点

是的,点后面的数字确实只是一个小数。点是小数点。 0.5 等值与 0.500 相同,均表示半秒,500 毫秒。

所以,2015-01-01T12:34:56.72015-01-01T12:34:56.700 相同。

【讨论】:

以上是关于在Java中解析日期的毫秒分数的主要内容,如果未能解决你的问题,请参考以下文章

Java日期时间API系列35-----Jdk8中java.time包中的新的日期时间API类应用,微秒和纳秒等更精确的时间格式化和解析。

“无法解析的日期:1302828677828”试图用 Gson 反序列化从服务器接收到的毫秒格式日期

java中怎样把毫秒转成时间类型?

JS 日期格式化和解析工具

java.time 是不是无法解析秒的分数?

在纪元中转换日期格式