Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:自定义时间戳格式:将格式验证为microsec精度_Java_Timestamp - Fatal编程技术网

Java:自定义时间戳格式:将格式验证为microsec精度

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

我的目标是 创建一个能够处理以下两个需求的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-10 18:27”和“2013-09-10 18:33”之间。(验证精度仅为分钟级)(可能为+2分钟或-2分钟的增量)


根据其中一位成员的建议,我编辑了这篇文章,目标是 一个具体问题

问题:

如何使用JAVA类验证高达微秒精度的自定义时间戳

这个类的两个参数是

1) 格式应为字符串

2) 时间戳值作为字符串

根据对各种搜索结果的分析,我的理解如下:

  • Java(默认情况下)不会在微秒级解析/格式化时间戳(我使用SimpleDataFormat)
  • 如果以毫秒为单位给出6位数字,它将以秒为单位重新计算该值,dateformat将被更新,新的dateformat将以毫秒为单位具有3位数字的精度
  • 我还看到一个建议使用java.sql.Timestamp的线程
  • 尝试过这种方法,但不起作用。 我无法将strTimestamp 2013-09-10T18:30:20.123456+10:00转换为时间戳对象

    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