使用带有附加字符的SimpleDataFormat在java中解析日期
我有以下日期:使用带有附加字符的SimpleDataFormat在java中解析日期,java,simpledateformat,date-parsing,Java,Simpledateformat,Date Parsing,我有以下日期: String data = "20160421095058613000"; 我想使用SimpleDataFormat检查这是否是有效日期。 我想要的模式是:“yyyymmddhhmmssss” 问题是我不知道如何在这个模式中包含日期末尾的3个零。 我试过: try { Date date = new SimpleDateFormat("yyyymmddhhmmssSSS000").parse(data); System.out.print
String data = "20160421095058613000";
我想使用SimpleDataFormat检查这是否是有效日期。
我想要的模式是:“yyyymmddhhmmssss”
问题是我不知道如何在这个模式中包含日期末尾的3个零。
我试过:
try {
Date date = new SimpleDateFormat("yyyymmddhhmmssSSS000").parse(data);
System.out.println(date);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
但我得到:
java.text.ParseException: Unparseable date: "20160421095058613000"
at java.text.DateFormat.parse(DateFormat.java:377)
at testare.main(testare.java:11)
您可以将字符串分为
20160421095058613
和000
。然后检查第一个字符串是否有效(使用SimpleDataFormat),然后只检查最后3个字符是否为零。您可以将字符串替换为20160421095058613
和000
。然后检查第一个字符串是否有效(使用SimpleDataFormat),然后只检查最后3个字符是否为零。微秒
try {
String data = "20160421095058613000";
Date date = new SimpleDateFormat("yyyyMMddhhmmssSSS").parse(data.substring(0, 17));
System.out.println(date);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
最后这些数字大概代表微秒。旧的遗留日期时间类只能处理毫秒
换句话说,最后六位数字代表一秒钟的分数
提示:如果您对此数据源有任何影响,请在将日期时间值序列化为文本时更改为使用标准格式
java.time
您应该使用java.time包中的现代日期时间类
time类使用纳秒的分辨率,最多为一秒小数的九位数。超过你的六位数微秒
有关格式化模式代码,请参见DateTimeFormatter
类。与旧的SimpleDateFormat
代码非常相似,但不完全相同
当您输入时,解析为LocalDateTime
缺少任何有关UTC或时区偏移量的信息
如果您从上下文中知道预期的偏移量或分区,则应用它生成OffsetDateTime
或ZonedDateTime
对象
要与尚未更新为java.time类型的旧代码进行互操作,可以通过对旧类调用新方法进行转换。请注意,从java.time转到旧类型可能意味着数据丢失,因为任何微秒或纳秒都会被截断为毫秒
所有这些问题已在其他问答中多次提及。有关更多信息和示例,请搜索堆栈溢出。微秒
最后这些数字大概代表微秒。旧的遗留日期时间类只能处理毫秒
换句话说,最后六位数字代表一秒钟的分数
提示:如果您对此数据源有任何影响,请在将日期时间值序列化为文本时更改为使用标准格式
java.time
您应该使用java.time包中的现代日期时间类
time类使用纳秒的分辨率,最多为一秒小数的九位数。超过你的六位数微秒
有关格式化模式代码,请参见DateTimeFormatter
类。与旧的SimpleDateFormat
代码非常相似,但不完全相同
当您输入时,解析为LocalDateTime
缺少任何有关UTC或时区偏移量的信息
如果您从上下文中知道预期的偏移量或分区,则应用它生成OffsetDateTime
或ZonedDateTime
对象
要与尚未更新为java.time类型的旧代码进行互操作,可以通过对旧类调用新方法进行转换。请注意,从java.time转到旧类型可能意味着数据丢失,因为任何微秒或纳秒都会被截断为毫秒
所有这些问题已在其他问答中多次提及。搜索堆栈溢出以获取更多信息和示例。几天前有一个问题(再也找不到它)表明,
SimpleDataFormat
无法处理模式中的文本'000'
。所以你需要删除它。注意你的格式字符串是错误的:如果你需要解析24小时而不是12小时的值,使用MM
代替MM
几个月(因为MM
意味着分钟),使用HH
代替HH
。@Tom你能给我一个到这个问题的链接吗?@AlexChihaia(再也找不到了);(P.几天前有一个问题(再也找不到了)表明,SimpleDataFormat
无法处理模式中的文本'000'
。因此您需要删除它。请注意,您的格式字符串是错误的:使用MM
而不是MM
(因为mm
表示分钟)如果您需要解析24小时而不是12小时的值,请使用HH
而不是HH
。@Tom您能给我一个到该问题的链接吗?@AlexChihaia“(再也找不到了)”;P。