无法解析日期并获得毫秒数

时间:2014-09-24 20:56:05

标签: java date-format simpledateformat

我正在尝试将字符串解析为日期。

我正在使用

new SimpleDateFormat("yyyyMMdd-HH:mm:ss.SSS").parse("20140923-14:32:34.456")

我的输出是:(日期对象)

Tue Sep 23 14:32:34 EDT 2014

我不明白为什么我没有得到毫秒。我需要日期和毫秒,而不仅仅是毫秒。

预期输出:(日期对象)

Tue Sep 23 14:32:34.456 EDT 2014

感谢

PS:我最后不想要一个字符串对象,而是一个日期。

4 个答案:

答案 0 :(得分:5)

您只是打印出调用Date.toString()的结果,其结果不包括毫秒。如果您在日期打印出调用getTime()的结果,您会看到它以“456”结尾,表示 解析了毫秒。

另外,不要被Date.toString()输出的“EDT”部分所迷惑。这并不意味着这是“EDT中的Date对象”...... Date根本没有时区;自unix时代以来只有几毫秒。

我建议您明确设置SimpleDateFormat的时区,但即使您故意将其设置为系统默认时区。通过明确地执行此操作,您可以向读者清楚地表明您意味着使用该时区,而不仅仅是您没有考虑它。您也应该采用相同的方法来处理语言环境 - 在这种情况下,我可能会指定Locale.US,对于专为机器解析而设计的格式而言,这通常是一个很好的选择。

答案 1 :(得分:2)

您在打印刚刚阅读的日期时也需要使用该格式:

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HH:mm:ss.SSS")
Date date = sdf.parse("20140923-14:32:34.456");
System.out.println(date);               // Tue Sep 23 14:32:34 EDT 2014
System.out.println(sdf.format(date));   // 20140923-14:32:34.456

答案 2 :(得分:1)

您的Date对象已包含正确的毫秒数。只是这样,当您再次将Date对象写回时,Date的默认String表示形式不包括毫秒。

你可能有:

DateFormat myFormat = new SimpleDateFormat("yyyyMMdd-HH:mm:ss.SSS");
Date myDate = myFormat.parse("20140923-14:32:34.456");

要输出以毫秒为单位的日期,您应该使用:

System.out.println(myFormat.format(myDate));

您可以使用其规范中还包含毫秒的不同DateFormat,而不是重用myFormat。

答案 3 :(得分:0)

answer by Jon Skeet是正确的。

约达时间

我将使用Joda-Time库添加一些示例代码。

与Java捆绑在一起的java.util.Date,java.util.Calendar和java.text.SimpleDateFormat类非常麻烦,在设计和实现方面都存在缺陷。避免他们。在Java 8中使用Joda-Time或java.time包(受Joda-Time启发,由JSR 310定义)。

在Joda-Time和java.time中,日期时间对象知道自己分配的time zone,与java.util.Date不同。另一个不同之处在于,这两个好的库都使用immutable objects,我们基于原始对象实例化新鲜对象,而不是改变(“变异”)原始对象。

DateTimeZone timeZone = DateTimeZone.UTC; // Or DateTimeZone.forID( "America/Montreal" )
DateTimeFormatter formatter = DateTimeFormat.forPattern( "yyyyMMdd-HH:mm:ss.SSS" ).withZone( timeZone );
DateTime dateTime = formatter.parseDateTime("20140923-14:32:34.456"); // Parsed *and* assigned the specified time zone.
String output = dateTime.toString();

您可以转换为其他时区。

DateTime dateTimeKolkata = dateTime.withZone( DateTimeZone.forID( "Asia/Kolkata" ) );

如果你真的需要一个java.util.Date,可能需要其他类,请转换为Joda-Time。

java.util.Date date = dateTime.toDate();