仅使用字符串格式化程序将纪元时间戳字符串转换为 Joda 日期时间

mat*_*ian 6 java format datetime timestamp epoch

假设我有一个字符串形式的时间戳“1355409000003”,有没有办法指定将其解析为 Joda DateTime 的 DateTime 格式?

即,我可以用格式“MM/dd/YYYY”解析“12/01/2012”,用“YYYY-MM-dd HH:mm”解析“2012-12-01 04:27”,但是我如何解析“ 1355409000003”?

编辑:不使用不同的构造函数,假设我必须指定要解析的字符串格式

Bas*_*que 3

太长了;博士

\n\n

只需解析你Stringlong . 没什么大不了。

\n\n

使用java.time类取代Joda-Time类。

\n\n
Instant.ofEpochMilli( \n    Long.parseLong( "1355409000003" ) \n)\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

2012-12-13T14:30:00.003Z

\n
\n\n

解析Stringlong

\n\n

你的问题确实没有意义。如果您得到一个表示自 1970-01-01T00:00Z 纪元以来的毫秒数的字符串,则将其转换String为 along并传递给 Joda-Time 的构造函数DateTime

\n\n

这已在答案中显示这在一个被莫名其妙删除的

\n\n
DateTime dt = new DateTime( Long.parseLong( "1355409000003" ) ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者,就我个人而言,我会分成两行。

\n\n
long millisSinceEpoch = Long.parseLong( "1355409000003" ) ;\nDateTime dt = new DateTime( millisSinceEpoch ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

您对该问题发表了此评论:

\n\n
\n

不幸的是,使用这些时间戳的结构不适合使用不同的构造函数 - 假设我需要指定字符串格式,是否有一种解析纪元时间戳的格式?

\n
\n\n

同样,您坚持使用 a 的构造函数String是无意义的,因为用解析调用包装您的文本数字非常简单Long.parseLong( "1355409000003" )不要小题大做。

\n\n

java.time

\n\n

Joda -Time项目现在处于维护模式,团队建议迁移到java.time类。

\n\n

该类表示UTCInstant时间线上的一个时刻,分辨率为纳秒(最多九 (9) 位小数)。

\n\n

这里使用java.time 的方法与上面使用Joda-Time 的方法相同:将 a 解析String为 a long,并使用该数字来获取Instant对象(而不是 aDateTime对象)。

\n\n

java.time类避免使用构造函数。因此,不要调用构造函数,而是调用静态工厂方法Instant.ofEpochMilli

\n\n
long millisSinceEpoch = Long.parseLong( "1355409000003" ) ;\nInstant instant = Instant.ofEpochMilli( millisSinceEpoch ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

定制方法

\n\n

如果提示您坚持的问题是在您的整个代码中发生这种情况,并且您希望避免所有额外的代码乱七八糟地堆放在您的代码库中Long.parseLong(,那么您可以创建自己的实用程序方法来封装此字符串到长整型的转换。

\n\n

不是推荐这样做,因为它看起来有点矫枉过正。但如果您坚持的话,这里有一些示例代码。

\n\n
package com.basilbourque.example;\n\nimport java.time.Instant;\n\npublic class InstantMaker\n{\n    static public Instant parseMillis ( String countOfMillisecondsSinceEpoch )\n    {\n        // TODO - Add code to test for invalid inputs, trap for exception thrown.\n        long millis = Long.parseLong( countOfMillisecondsSinceEpoch );\n        Instant instant = Instant.ofEpochMilli( millis);\n        return instant;\n    }\n\n    // Constructor. Hide the default constructor as "private". We have no need for instances here.\n    private InstantMaker ( )\n    {\n    }\n\n    // `main` method for testing ad demonstration.\n    public static void main ( String[] args )\n    {\n        Instant instant = InstantMaker.parseMillis( "1355409000003" );\n        System.out.println( instant );\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果这是您关心的问题,我建议真正的问题是依赖于纪元计数,无论它是文本还是数字。从纪元计数使日期时间处理变得更加困难,因为人类无法识别这些值。这使得故障排除、调试和日志记录变得棘手且不必要地复杂。我建议重构您的代码以传递Instant实例而不是像这样的字符串"1355409000003".

\n\n

ISO 8601

\n\n

如果必须将日期时间值序列化为文本,请仅使用标准ISO 8601格式。这是该标准的主要目的,在系统之间交换日期时间值。这些格式的设计实用且合理,易于机器解析,也易于跨文化的人类阅读。

\n\n

java.time类在解析/生成字符串时默认使用标准 ISO 8601 格式您可以在这个答案中看到上面此类字符串的示例。

\n\n
\n\n

关于java.time

\n\n

java.time框架内置于 Java 8 及更高版本中这些类取代了麻烦的旧遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

\n\n

Joda -Time项目现在处于维护模式,建议迁移到java.time类。

\n\n

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

\n\n

您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC 驱动程序。不需要字符串,不需要类。java.sql.*

\n\n

从哪里获取 java.time 类?

\n\n\n\n

ThreeTen -Extra项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如Interval、、、等等。YearWeekYearQuarter

\n