Epoch时间戳字符串到Joda日期时间使用ONLY字符串格式化程序

时间:2015-04-23 18:21:02

标签: java datetime format timestamp epoch

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

是的,我可以用“YYYY-MM-dd HH:mm”解析格式为“MM / dd / YYYY”和“2012-12-01 04:27”的“12/01/2012”,但怎么能我解析“1355409000003”?

编辑:不使用不同的构造函数,假设我必须指定一个String格式来解析

1 个答案:

答案 0 :(得分:1)

TL;博士

只是parse your String to long。没什么大不了的。

使用取消 Joda-Time 项目的 java.time 类。

Instant.ofEpochMilli( 
    Long.parseLong( "1355409000003" ) 
)
  

2012-12-13T14:30:00.003Z

String解析为long

你的问题没有意义。如果你得到一个表示自1970-01-01T00:00Z纪元以来的毫秒数的字符串,那么将String转换为long并传递给Joda-Time {{1}的构造函数}类型。

这显示在an Answer中,被莫名其妙地删除了。

DateTime

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

DateTime dt = new DateTime( Long.parseLong( "1355409000003" ) ) ;

您将此评论发布到该问题:

  

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

同样,你坚持使用long millisSinceEpoch = Long.parseLong( "1355409000003" ) ; DateTime dt = new DateTime( millisSinceEpoch ) ; 的构造函数是没有意义的,因为使用解析调用来包装你的文本数字很简单:StringDon’t make a mountain out of a molehill.

java.time

Joda-Time项目现在位于maintenance mode,团队建议迁移到java.time课程。

Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

java.time 相同的方法如上所述 Joda-Time :将Long.parseLong( "1355409000003" )解析为String,然后使用获取long对象(而不是Instant对象的数字)。

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

DateTime

自定义方法

如果提示您坚持的问题是在整个代码中出现这种情况,并且您希望避免使用所有额外的long millisSinceEpoch = Long.parseLong( "1355409000003" ) ; Instant instant = Instant.ofEpochMilli( millisSinceEpoch ) ; 乱丢代码库,那么您可以使用自己的实用程序方法将此字符串封装到 - 长期转换。

推荐这个似乎有点矫枉过正。但如果你坚持,这里有一些示例代码。

Long.parseLong(

如果这是您关注的问题,我建议真正的问题是依赖于来自时代的计数,无论它是文本还是数字。从历史开始计数使得日期时间处理变得更加困难,因为人类无法辨别这些值。这使得故障排除,调试和日志记录变得棘手并且不必要地复杂化。我建议重构您的代码以传递package com.basilbourque.example; import java.time.Instant; public class InstantMaker { static public Instant parseMillis ( String countOfMillisecondsSinceEpoch ) { // TODO - Add code to test for invalid inputs, trap for exception thrown. long millis = Long.parseLong( countOfMillisecondsSinceEpoch ); Instant instant = Instant.ofEpochMilli( millis); return instant; } // Constructor. Hide the default constructor as "private". We have no need for instances here. private InstantMaker ( ) { } // `main` method for testing ad demonstration. public static void main ( String[] args ) { Instant instant = InstantMaker.parseMillis( "1355409000003" ); System.out.println( instant ); } } 个实例,而不是Instant之类的字符串。

ISO 8601

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

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

关于 java.time

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

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要"1355409000003"类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore