Java:自定义时间戳格式:将格式验证为microsec精度
我的目标是 创建一个能够处理以下两个需求的java类 (A)1。验证时间戳的格式是否与预期格式匹配。Java:自定义时间戳格式:将格式验证为microsec精度,java,timestamp,Java,Timestamp,我的目标是 创建一个能够处理以下两个需求的java类 (A)1。验证时间戳的格式是否与预期格式匹配。 CCYY-MM-DD'T'hh:MM:ss'.0000000000+'uh:um“ 示例:预期的格式不是静态的 它可能是其中的一个 “2013-09-10T18:30:20.123456+10:00”或 “2013-09-10T18:30:20.123+10:00”。 我不为这件事烦恼 精度和价值。只有格式才重要 (B)2.验证时间戳是否在特定范围内。 例如:验证时间戳是否在 在“2013-09
CCYY-MM-DD'T'hh:MM:ss'.0000000000+'uh:um“
示例:预期的格式不是静态的 它可能是其中的一个 “2013-09-10T18:30:20.123456+10:00”或 “2013-09-10T18:30:20.123+10:00”。
我不为这件事烦恼 精度和价值。只有格式才重要 (B)2.验证时间戳是否在特定范围内。
例如:验证时间戳是否在 在“2013-09-10 18:27”和“2013-09-10 18:33”之间。(验证精度仅为分钟级)(可能为+2分钟或-2分钟的增量)
根据其中一位成员的建议,我编辑了这篇文章,目标是 一个具体问题 问题: 如何使用JAVA类验证高达微秒精度的自定义时间戳 这个类的两个参数是 1) 格式应为字符串 2) 时间戳值作为字符串 根据对各种搜索结果的分析,我的理解如下:
Timestamp ts = Timestamp.valueOf(strTimestamp);
java.lang.IllegalArgumentException:
Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
我无法将输入格式转换为时间戳对象
我有一个使用正则表达式进行验证的变通方法:
2013-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9]).[0-9][0-9][0-9][0-9][0-9][0-9]\+10:00
这个regex的问题是,我期望的时间戳格式不是静态的,所以我必须对每个模式使用regex
因此,我试图找出java中是否存在任何健壮的解决方案,即使预期的格式发生变化,这些解决方案也可以自给自足。A
java.sql.Timestamp
对您没有帮助,因为这是一个java.util.Date
如果将正确的格式字符串与SimpleDateFormat
一起使用,则代码相当简单,您可以让它完成繁重的工作。下面是一个完整的工作解决方案:
public static boolean isNear(String timestamp, int microPlaces, Date near, int minutes) {
if (!timestamp.matches(".*\\.\\d{" + microPlaces + "}\\D.*") {
return false;
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSSSSZ");
try {
Date date = sdf.parse(timestamp.replaceAll(":(?=\\d\\d$)", ""));
return Math.abs(date.getTime() - near.getTime()) <= minutes * 60000;
} catch (ParseException ignore) {
return false; // string was not of correct format
}
}
输出:
true
true
false
false
实际上,我也在试图找到这个问题的答案。因为我没有能力对波西米亚式的答案添加注释。我想提到的是,SimpleDataFormat中的“S”模式不是用于微秒,而是用于毫秒。这意味着对于模式“yyyy-MM-dd'T'hh:MM:ss.SSSSSSZ”“字符串中提供的微秒数字将被解析为毫秒。 因此,前三位数字将作为XXX秒传递,其值将添加到日期。所以我们可以在大约16分钟内收到错误 Java8中的java.time 在中定义了一个新的。它的日期时间类解析为纳秒。小数点后有9位 time包的灵感来自于java.time,但完全是重新设计的。概念是相似的 与Joda Time一样,java.Time包使用ISO 8601格式作为解析和格式化的默认格式。因此,您可以输入或输出字符串,例如
2013-09-10T18:30:20.123456789+10:00
Java8的早期版本现已推出。官方发布应该在这个月
一个将这个包向后移植到Java早期版本的项目正在进行中。我不知道它的现状和成功。backport项目独立于Oracle和OpenJDK项目
毫秒
旧的绑定类java.util.Date和.Calendar使用毫秒的精度
优秀的库也是如此,毫秒精度
因此,小数秒内的数字不足,无法满足您的需要。将问题中的问题数量限制为一个。如果有必要的话,可以问单独的问题。我编辑这篇文章是为了针对一个特定的问题…要求是验证实际的时间戳格式是否与预期的时间戳格式匹配到microsec精度。正如您所提到的,上面的代码不需要microsecs中的所有数字,时间戳可以有任何数字。因此,此代码不处理该要求。当预期的时间戳有6位数字时,类应强制所有6位数字。如果不返回false/exception。当预期的时间戳有3位数字时,类应该只指定3位数字。如前所述,如果不返回false/exception.If,我已经有了解决方法。解析以使用SimpleDataFormat(“yyyy-MM-dd'T:hh:MM:ss.ssssz”)检查有效日期;因为这实际上并不能在微秒内验证所有数字,所以我可以对字符串进行长度检查以确认没有数字。但我觉得这一切都是一种摇摆不定的做事方式。我正在寻找解决方案,Java可以简单而直接地实现这一点。我使用的是Java6,所以您想检查是否只有3位或6位微秒?Ie如果不是3或6,则返回false?
预期格式为以下任一种:
2013-09-17T10:31:30.123+10:00或2013-09-17T10:31:30.123456+10:00或2013-09-17T10:31:30.123456789+10:00预期格式将作为参数传递给类。它应该与确切的格式匹配。上面有三个(3/6/9)。只有这三种格式才是人们所期望的。
true
true
false
false