Java 有没有办法比较不同格式的时间戳?

Java 有没有办法比较不同格式的时间戳?,java,testing,automation,rest-assured,timestamp-with-timezone,Java,Testing,Automation,Rest Assured,Timestamp With Timezone,我试图比较来自数据库和web服务的响应 response from web services is : 2020-01-07T17:15:00-08:00 response from database is : 2020-01-08 01:15:00.0 如何将两者转换为通用格式 或者有没有一种方法可以使用子字符串来匹配比较 这些字符串表示某些格式。比较它们就相当于问“这些格式相同吗”——它们不同,这不是您想要测试的(您想要测试:这些格式不同的字符串是否代表相同的时间点) 那么,就这样

我试图比较来自数据库和web服务的响应

response from web services is : 2020-01-07T17:15:00-08:00
response from database is :     2020-01-08 01:15:00.0
如何将两者转换为通用格式


或者有没有一种方法可以使用子字符串来匹配比较

这些字符串表示某些格式。比较它们就相当于问“这些格式相同吗”——它们不同,这不是您想要测试的(您想要测试:这些格式不同的字符串是否代表相同的时间点)

那么,就这样做吧。首先,将这些字符串(对于人类而言)转换为实际的适当时间对象,然后比较它们

您可以将这些字符串转换为一个
瞬间
,它表示时间上的瞬间,也可能是您在此处查找的内容,然后将两者转换为瞬间后,您可以比较这两个瞬间


要将字符串转换为
即时
,请使用
DateTimeFormatter
。更多信息:。

这些字符串表示某些格式。比较它们就相当于问“这些格式相同吗”——它们不同,这不是您想要测试的(您想要测试:这些格式不同的字符串是否代表相同的时间点)

那么,就这样做吧。首先,将这些字符串(对于人类而言)转换为实际的适当时间对象,然后比较它们

您可以将这些字符串转换为一个
瞬间
,它表示时间上的瞬间,也可能是您在此处查找的内容,然后将两者转换为瞬间后,您可以比较这两个瞬间


要将字符串转换为
即时
,请使用
DateTimeFormatter
。更多信息:。

您可以将时间戳转换为等效的日期格式。web服务似乎是ISO,因此您可以将数据库时间戳转换为ISO,然后最终解析文本以生成日期,您可以使用该日期进行比较

例如:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class CompareTimeStamp {

    private String webServiceTS = ": 2020-01-07T17:15:00-08:00".replace(": ", "");
    private String dataBaseTS = ": 2020-01-08 01:15:00.0".replace(": ", "");
    private DateTimeFormatter isoFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX");
    private DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");

    public static void main(String[] args) {
        CompareTimeStamp cts = new CompareTimeStamp();
        LocalDateTime webServiceTime = LocalDateTime.parse(cts.webServiceTS, cts.isoFormat);
        LocalDateTime dataBaseTime = LocalDateTime.parse(cts.dataBaseTS, cts.format);
        /** OPTION 1 -Remove below code if not choosing this option*/
        System.out.println("webServiceTime: " + webServiceTime);
        System.out.println("dataBaseTime: " + dataBaseTime);
        System.out.println(cts.compareTimeStamps(webServiceTime, dataBaseTime) + "\n");
        /*********************************************************************/

        /** OPTION 2 -Remove below code if not choosing this option*/
        String webServiceTS = cts.formatTimeStamp(webServiceTime);
        String dataBaseTS = cts.formatTimeStamp(dataBaseTime);
        System.out.println("webServiceTS: " + webServiceTS);
        System.out.println("dataBaseTS: " + dataBaseTS);
        System.out.println(cts.compareTimeStamps(webServiceTS, dataBaseTS));
        /*********************************************************************/
    }

    // OPTION 1 - Compares this LocalDateTime with another ensuring that the date-time is the same.
    private String compareTimeStamps(LocalDateTime webServiceTime, LocalDateTime dataBaseTime) {
        if (webServiceTime.equals(dataBaseTime)) {
            return "Time stamp matches";
        } else {
            return "Time stamp does not match";
        }
    }

    // OPTION 2 - Compares this string to the specified object.
    private String compareTimeStamps(String webServiceTS2, String dataBaseTS2) {
        if (webServiceTS2.equals(dataBaseTS2)) {
            return "Time stamp matches";
        } else {
            return "Time stamp does not match";
        }
    }

    private String formatTimeStamp(LocalDateTime timeStamp) {
        DateTimeFormatter formating = DateTimeFormatter.ofPattern("EEEE, MMM d, yyyy HH:mm:ss a");
        String localTimeStamp = formating.format(timeStamp);
        return localTimeStamp;
    }
}
产出:

webServiceTime: 2020-01-07T17:15
dataBaseTime: 2020-01-08T01:15
Time stamp does not match

webServiceTS: Tuesday, Jan 7, 2020 17:15:00 PM
dataBaseTS: Wednesday, Jan 8, 2020 01:15:00 AM
Time stamp does not match
webServiceTime: 2020-01-07T17:15
dataBaseTime: 2020-01-07T17:15
Time stamp matches

webServiceTS: Tuesday, Jan 7, 2020 17:15:00 PM
dataBaseTS: Tuesday, Jan 7, 2020 17:15:00 PM
Time stamp matches
修改时间戳:

产出:

webServiceTime: 2020-01-07T17:15
dataBaseTime: 2020-01-08T01:15
Time stamp does not match

webServiceTS: Tuesday, Jan 7, 2020 17:15:00 PM
dataBaseTS: Wednesday, Jan 8, 2020 01:15:00 AM
Time stamp does not match
webServiceTime: 2020-01-07T17:15
dataBaseTime: 2020-01-07T17:15
Time stamp matches

webServiceTS: Tuesday, Jan 7, 2020 17:15:00 PM
dataBaseTS: Tuesday, Jan 7, 2020 17:15:00 PM
Time stamp matches

可以将时间戳转换为等效的日期格式。web服务似乎是ISO,因此您可以将数据库时间戳转换为ISO,然后最终解析文本以生成日期,您可以使用该日期进行比较

例如:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class CompareTimeStamp {

    private String webServiceTS = ": 2020-01-07T17:15:00-08:00".replace(": ", "");
    private String dataBaseTS = ": 2020-01-08 01:15:00.0".replace(": ", "");
    private DateTimeFormatter isoFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX");
    private DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");

    public static void main(String[] args) {
        CompareTimeStamp cts = new CompareTimeStamp();
        LocalDateTime webServiceTime = LocalDateTime.parse(cts.webServiceTS, cts.isoFormat);
        LocalDateTime dataBaseTime = LocalDateTime.parse(cts.dataBaseTS, cts.format);
        /** OPTION 1 -Remove below code if not choosing this option*/
        System.out.println("webServiceTime: " + webServiceTime);
        System.out.println("dataBaseTime: " + dataBaseTime);
        System.out.println(cts.compareTimeStamps(webServiceTime, dataBaseTime) + "\n");
        /*********************************************************************/

        /** OPTION 2 -Remove below code if not choosing this option*/
        String webServiceTS = cts.formatTimeStamp(webServiceTime);
        String dataBaseTS = cts.formatTimeStamp(dataBaseTime);
        System.out.println("webServiceTS: " + webServiceTS);
        System.out.println("dataBaseTS: " + dataBaseTS);
        System.out.println(cts.compareTimeStamps(webServiceTS, dataBaseTS));
        /*********************************************************************/
    }

    // OPTION 1 - Compares this LocalDateTime with another ensuring that the date-time is the same.
    private String compareTimeStamps(LocalDateTime webServiceTime, LocalDateTime dataBaseTime) {
        if (webServiceTime.equals(dataBaseTime)) {
            return "Time stamp matches";
        } else {
            return "Time stamp does not match";
        }
    }

    // OPTION 2 - Compares this string to the specified object.
    private String compareTimeStamps(String webServiceTS2, String dataBaseTS2) {
        if (webServiceTS2.equals(dataBaseTS2)) {
            return "Time stamp matches";
        } else {
            return "Time stamp does not match";
        }
    }

    private String formatTimeStamp(LocalDateTime timeStamp) {
        DateTimeFormatter formating = DateTimeFormatter.ofPattern("EEEE, MMM d, yyyy HH:mm:ss a");
        String localTimeStamp = formating.format(timeStamp);
        return localTimeStamp;
    }
}
产出:

webServiceTime: 2020-01-07T17:15
dataBaseTime: 2020-01-08T01:15
Time stamp does not match

webServiceTS: Tuesday, Jan 7, 2020 17:15:00 PM
dataBaseTS: Wednesday, Jan 8, 2020 01:15:00 AM
Time stamp does not match
webServiceTime: 2020-01-07T17:15
dataBaseTime: 2020-01-07T17:15
Time stamp matches

webServiceTS: Tuesday, Jan 7, 2020 17:15:00 PM
dataBaseTS: Tuesday, Jan 7, 2020 17:15:00 PM
Time stamp matches
修改时间戳:

产出:

webServiceTime: 2020-01-07T17:15
dataBaseTime: 2020-01-08T01:15
Time stamp does not match

webServiceTS: Tuesday, Jan 7, 2020 17:15:00 PM
dataBaseTS: Wednesday, Jan 8, 2020 01:15:00 AM
Time stamp does not match
webServiceTime: 2020-01-07T17:15
dataBaseTime: 2020-01-07T17:15
Time stamp matches

webServiceTS: Tuesday, Jan 7, 2020 17:15:00 PM
dataBaseTS: Tuesday, Jan 7, 2020 17:15:00 PM
Time stamp matches

我们不知道。字符串不提供相同的信息,因此来自它们的信息不容易比较。如果您知道第二个字符串中假定的时区,我们将每个时区转换为一个时间点并进行比较

前一个字符串比较简单,因为除了日期和时间之外,它还通知我们与UTC的偏移(时区偏移)。通过这个字符串,我们可以确定一个时间点。此外,字符串采用ISO 8601格式。现代java日期和时间API java.time类将ISO 8601格式(或其最常见的变体)解析为默认格式,即不使用任何显式格式化程序

    String responseFromWs = "2020-01-07T17:15:00-08:00";
    OffsetDateTime odtFromWs = OffsetDateTime.parse(responseFromWs);
    System.out.println(odtFromWs);
目前的输出是:

它看起来非常像输入(只省略了
00
秒)。这是因为
OffsetDateTime
也会将ISO 8601格式打印回来(根据该格式,秒数是可选的)。重要的是我们有一个日期时间对象,可以用于进一步的处理,比如与其他日期时间对象进行比较

第二个字符串(来自数据库的字符串)的问题是我们不知道隐含的偏移量。常见的建议包括在数据库中以UTC格式存储日期和时间,也不要将其作为字符串从数据库中提取,而是作为适当的日期时间对象,例如像我们以前使用的那样使用
OFfsetDateTime

如果您知道字符串是UTC格式的,并且我们现在依赖该字符串:

    DateTimeFormatter dbFormatter = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_LOCAL_DATE)
            .appendLiteral(' ')
            .append(DateTimeFormatter.ISO_LOCAL_TIME)
            .toFormatter();

    String responseFromDatabase = "2020-01-08 01:15:00.0";

    OffsetDateTime odtFromDb = LocalDateTime
            .parse(responseFromDatabase, dbFormatter)
            .atOffset(ZoneOffset.UTC);
    System.out.println(odtFromDb);
现在我们有两个
OffsetDateTime
对象。他们有比较的方法:

    System.out.println("Before: " + odtFromWs.isBefore(odtFromDb));
    System.out.println("After: " + odtFromWs.isAfter(odtFromDb));
    System.out.println("Same time: " + odtFromWs.isEqual(odtFromDb));
    System.out.println("Equal: " + odtFromWs.equals(odtFromDb));
您可能会惊讶地发现,
isEqual()
返回true,而
equals()
返回false。这是因为
isEqual()
测试这两个对象是否表示相同的时间点,而
equals()
需要相同的时间点和相同的偏移量才能生成true。由于两个对象具有不同的偏移量,因此在本例中返回false

您的JDBC驱动程序或JPA实现可能很乐意从数据库中获取日期时间对象,而不是字符串,正如我所说,这是推荐的。详细信息取决于数据库中使用的数据类型,但您可以在我对不同问题的回答中阅读更多内容,请参阅底部的链接

链接
  • 解释如何使用java.time

  • 我们不知道。字符串不提供相同的信息,因此来自它们的信息不容易比较。如果您知道第二个字符串中假定的时区,我们将每个时区转换为一个时间点并进行比较

    前一个字符串比较简单,因为除了日期和时间之外,它还通知我们与UTC的偏移(时区偏移)。通过这个字符串,我们可以确定一个时间点。此外,字符串采用ISO 8601格式。现代java日期和时间API java.time类将ISO 8601格式(或其最常见的变体)解析为默认格式,即不使用任何显式格式化程序

        String responseFromWs = "2020-01-07T17:15:00-08:00";
        OffsetDateTime odtFromWs = OffsetDateTime.parse(responseFromWs);
        System.out.println(odtFromWs);
    
    目前的输出是:

    它看起来非常像输入(只省略了
    00
    秒)。这是因为
    OffsetDateTime
    也会将ISO 8601格式打印回来(根据该格式,秒数是可选的)。重要的是我们有一个日期时间对象,可以用于进一步的处理,比如与其他日期时间对象进行比较

    第二个字符串(来自数据库的字符串)的问题是我们不知道隐含的偏移量。共同建议包括