我正在尝试将字符串解析为日期。
我正在使用
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:我最后不想要一个字符串对象,而是一个日期。
答案 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();