2014-04-24 34 views
2
String s = 19.17.38.008000; 
DateFormat f = new SimpleDateFormat("HH.mm.ss.SSSSSS"); 
Date d = f.parse(s); 
system.out.println(d); 

这是我正在运行时,它打印它打印的时间 十九点17分46秒,除了精细的代码。请人给我讲解一下SimpleDateFormat的正确分析串

补充说明:

String s = 19.17.38.008000; 
DateFormat f = new SimpleDateFormat("HH.mm.ss"); 
Date d = f.parse(s); 
system.out.println(d); 

这个代码将正确打印相同的串减去毫秒。有人请告诉我我在这里错过了什么。

编辑:感谢您的答案我认为这里的问题是我读38.008000为0.008秒,但sdf读取SSS为8000毫秒,这是不一样的事情。

+0

如果我正确理解答案,它将忽略前导2个零并将尾随3注册为8000毫秒,然后将其添加到时间。是否有一个已知的解决方法,将显示毫秒,而不是添加它们,因为我比较2次,有时会有毫秒中的6位数 –

回答

3

SSSSSS仍然是毫秒,即使你把其中的6。 19:17:38 + 008000毫秒是19:17:46所以它是正确的,如果令人惊讶的话。

AFAIK Java 8中的java.time库支持微秒(和纳秒)时间戳。

谢谢@Meno的更正。

+0

谢谢大家的帮助,只是为了澄清每个人都在说的问题。 当我读3.01秒时,我将其解释为3秒和1秒1秒。 simpleDateFormat中的'S'表示完全不同的毫秒。所以3.33455解释为“s。SSSSS“与3 secons相同,33455毫秒不是3秒和33.455%秒。 –

+0

感谢您提供的更多信息,这是一个尚未更新到java 8的企业框架 –

+0

@ user3570467有一个backport for Java 7 https://github.com/ThreeTen/threetenbp –

5

SimpleDateFormat课程将008000解释为8000毫秒或8秒,并将其添加到已解释的38秒。

如果我们有这样的:

String s = "19.17.38.009000"; 

然后我们会得到这样的输出,用滴加9秒时:

Thu Jan 01 19:17:47 PST 1970 

从字符串的结尾处删除3个额外的零。如果有6位数字,那么他们看起来应该代表微秒(百万分之一秒),而不是毫秒(千分之一秒)。

String s = "19.17.38.008"; 

输出:

Thu Jan 01 19:17:38 PST 1970 
+0

我喜欢这个答案,但我无法更改字符串本身我正在接收字符串从一个数据库,并且必须将其与另一个日期进行比较,确切精度为6毫秒。但是,这个答案确实解释了我正在发生的事情,我只能解决它。 –

+0

您不必更改来自数据库的'String'的源,但您可以随时从数据库中删除最后3位数字 - 就像's = s.substring(0,s .length() - 3);'。 – rgettman

+0

我想到了,但不幸的是,这将只适用于这种确切的情况下,我做了成千上万的这些,将会有很多说.334887或没有尾随或领先0的东西,因此不能被截断相同的方式 –

相关问题