如何将timestamp字符串转换为java.util.Date

我需要将时间戳字符串转换为java.util.Date 。 例如:

MMDDYYHHMMSSMM-DD-YY HH-MM-SS

MM是月份, DD是日期, YY是年份, HH是小时, MM是分钟, SS是秒。

可以这样做:

 DateFormat format = new SimpleDateFormat("MMddyyHHmmss"); Date date = format.parse("022310141505"); 

但我强烈建议你改用Joda Time 。 这是一个更好的日期/时间库,很长很长的路要走。 特别是,Joda Time中的格式化程序/解析器是线程安全的,因此您可以自由地和静态地重用它们; java.text.SimpleDateFormat 不是线程安全的,因此您需要为每个线程创建一个或使用synchronized块序列化对它的访问。

使用带有适当格式字符串的SimpleDateFormat (小心使用正确的格式字母,大写和小写有不同的含义!)。

TL;博士

 java.time.LocalDateTime.parse( "012318123456" , DateTimeFormatter.ofPattern( "MMdduuHHmmss" ) ).format( DateTimeFormatter.ofPattern( "MM-dd-uu HH-mm-ss" ) ) 

01-23-18 12-34-56

java.time

现代方法使用java.time类。

定义格式模式以匹配输入字符串。

 DateTimeFormatter f = DateTimeFormatter.ofPattern( "MMdduuHHmmss" ) ; 

您的两位数年份将被解释为21世纪(20xx)。

解析为LocalDateTime因为您的输入字符串缺少任何时区指示符或来自UTC的偏移量。

 LocalDateTime ldt = LocalDateTime.parse( "012318123456" , f ) ; 

ldt.toString():2018-01-23T12:34:56

生成所需格式的字符串。

 DateTimeFormatter fOut = DateTimeFormatter.ofPattern( "MM-dd-uu HH-mm-ss" ) ; String output = ldt.format( fOut ); 

01-23-18 12-34-56

ISO 8601

由于多种原因,您的两种格式都很糟糕。

序列化日期时间值时,请尽可能使用标准ISO 8601格式。 它们设计实用,易于通过机器解析,易于人类跨文化阅读。

对于诸如你的日期时间,中间的T将日期部分与时间部分分开。

2018-01-23T12:34:56


关于java.time

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

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

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • 更高版本的Android捆绑java.time类的实现。
    • 对于早期的Android, ThreeTenABP项目采用ThreeTen-Backport (如上所述)。 请参见如何使用ThreeTenABP ….

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