只需解析你String
的long
. 没什么大不了。
使用java.time类取代Joda-Time类。
\n\nInstant.ofEpochMilli( \n Long.parseLong( "1355409000003" ) \n)\n
Run Code Online (Sandbox Code Playgroud)\n\n\n\n\n2012-12-13T14:30:00.003Z
\n
String
为long
你的问题确实没有意义。如果您得到一个表示自 1970-01-01T00:00Z 纪元以来的毫秒数的字符串,则将其转换String
为 along
并传递给 Joda-Time 的构造函数DateTime
。
这已在答案中显示这在一个被莫名其妙删除的
\n\nDateTime dt = new DateTime( Long.parseLong( "1355409000003" ) ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n或者,就我个人而言,我会分成两行。
\n\nlong 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" )
:不要小题大做。
Joda -Time项目现在处于维护模式,团队建议迁移到java.time类。
\n\n该类表示UTCInstant
时间线上的一个时刻,分辨率为纳秒(最多九 (9) 位小数)。
这里使用java.time 的方法与上面使用Joda-Time 的方法相同:将 a 解析String
为 a long
,并使用该数字来获取Instant
对象(而不是 aDateTime
对象)。
java.time类避免使用构造函数。因此,不要调用构造函数,而是调用静态工厂方法Instant.ofEpochMilli
。
long millisSinceEpoch = Long.parseLong( "1355409000003" ) ;\nInstant instant = Instant.ofEpochMilli( millisSinceEpoch ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n如果提示您坚持的问题是在您的整个代码中发生这种情况,并且您希望避免所有额外的代码乱七八糟地堆放在您的代码库中Long.parseLong(
,那么您可以创建自己的实用程序方法来封装此字符串到长整型的转换。
我不是推荐这样做,因为它看起来有点矫枉过正。但如果您坚持的话,这里有一些示例代码。
\n\npackage 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"
.
如果必须将日期时间值序列化为文本,请仅使用标准ISO 8601格式。这是该标准的主要目的,在系统之间交换日期时间值。这些格式的设计实用且合理,易于机器解析,也易于跨文化的人类阅读。
\n\njava.time类在解析/生成字符串时默认使用标准 ISO 8601 格式。您可以在这个答案中看到上面此类字符串的示例。
\n\njava.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧遗留日期时间类,例如java.util.Date
, Calendar
, & SimpleDateFormat
。
Joda -Time项目现在处于维护模式,建议迁移到java.time类。
\n\n要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
\n\n您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC 驱动程序。不需要字符串,不需要类。java.sql.*
从哪里获取 java.time 类?
\n\nThreeTen -Extra项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如Interval
、、、等等。YearWeek
YearQuarter