SimpleDateFormat
不解析超过毫秒精度。另外,请查看文档中的以下描述(强调我的):
从给定字符串的开头解析文本以生成日期。
该方法可能不会使用给定字符串的整个文本。
因此,即使您的模式有六个S
,也SimpleDateFormat
只使用前三个,即
HH.mm.ss.SSS
换句话说,对于您的字符串,SimpleDateFormat
无论您使用HH.mm.ss.SSS
或,都会给您同样的错误结果HH.mm.ss.SSSSSS
。SimpleDateFormat
充满了很多这样的惊喜。为了在使用时解决问题SimpleDateFormat
,您需要0
从字符串末尾删除三个 s,即如果您解析19.17.38.008
,SimpleDateFormat
将给出您想要的结果。
因此,旧的日期时间 API(java.util
日期时间类型及其格式化 API SimpleDateFormat
)不仅过时而且容易出错。建议完全停止使用它们并切换到java.time
现代日期时间 API *。
使用现代日期时间 API 的演示:
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String args[]) {
String s = "19.17.38.008000";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH.mm.ss.SSSSSS", Locale.ENGLISH);
LocalTime time = LocalTime.parse(s, dtf);
System.out.println(time);
}
}
输出:
19:17:38.008
请注意,如果您尝试将HH.mm.ss.SSS
, 与java.time
API 一起用于您的字符串,它会抛出一个异常,提醒您有问题,同时SimpleDateFormat
默默地解析您的字符串,从而给您带来不希望的结果。
从Trail: Date Time了解有关现代日期时间 API *的更多信息。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaring和How to use ThreeTenABP in Android Project。