使用带有附加字符的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。