假设我有一个时间戳“1355409000003”作为字符串,有没有办法指定将其解析为Joda DateTime的DateTime格式?
是的,我可以用“YYYY-MM-dd HH:mm”解析格式为“MM / dd / YYYY”和“2012-12-01 04:27”的“12/01/2012”,但怎么能我解析“1355409000003”?编辑:不使用不同的构造函数,假设我必须指定一个String格式来解析
答案 0 :(得分:1)
只是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 ) ;
的构造函数是没有意义的,因为使用解析调用来包装你的文本数字很简单:String
。 Don’t make a mountain out of a molehill.
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格式。这是标准的主要目的,在系统之间交换日期时间值。这些格式设计实用且合理,易于通过机器进行解析,并且易于被不同文化的人阅读。
java.time 类在解析/生成字符串时默认使用标准的ISO 8601格式。您可以在本答案中看到上述字符串的示例。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance 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的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。