如何将两个不同的字符串日期转换为单个日期格式

时间:2019-09-15 09:15:36

标签: java datetime-format datetime-comparison

我有两个要转换为特定日期时间格式的字符串,因此可以进行比较。我遇到的问题是它在解析时出错并带有异常,我想知道我是否做错了什么。想问一下将两个不同的字符串日期转换为单个日期格式的最佳方法是什么

SimpleDateFormat localDateFormat = new SimpleDateFormat("yyyy dd mm - HH:mm:ss");
        String firstDateString= "11 May 2018 21:03:51 GMT";
        String secondDateString= "dataStore.get("2018-05-11T21:03:51Z";

        Date firstDateFormat =localDateFormat.parse(firstDateString);
        Date secondDateFormat =localDateFormat.parse(secondDateString);

3 个答案:

答案 0 :(得分:0)

  

我所遇到的问题是它在解析时出现错误,并带有异常   我不知道我做错了什么。

=>是的,您实际上正在这样做。您首先需要解析日期为实际格式,然后格式化为所需格式。

例如:用于解析和格式化2018-05-11T21:03:51Z

DateFormat originalFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:MM:SS'z'", Locale.ENGLISH);
DateFormat targetFormat = new SimpleDateFormat("yyyy dd mm - HH:mm:ss");
Date date = originalFormat.parse("2018-05-11T21:03:51Z");
String formattedDate = targetFormat.format(date);  // 2018 05 11 - 21:03:51

答案 1 :(得分:0)

这里:

SimpleDateFormat localDateFormat = new SimpleDateFormat("yyyy dd mm - HH:mm:ss");

该格式为:4位数字SPACE 2天数字SPACE 2月数字DASH等。

事实是:您的字符串都不是日期:

    "11 May 2018 21:03:51 GMT"
    "2018-05-11T21:03:51Z"

看起来像那样。第一个是“ dd M yyy ...”(不以年份开头),第二个使用“-”而不是“”作为初始日期的分隔符。

答案:您必须使用与预期的日期字符串真正匹配的模式,有关规格,请参见here。并请注意,例如,您将需要使用M来匹配“ May”,小写的m大约是数字,而不是单词!

请注意:第二个示例是一个ISO日期,DateTimeFormatter已经具有针对这些日期的预定义格式器! (因此请小心重新发明轮子)

答案 2 :(得分:0)

java.time

    DateTimeFormatter firstFormatteer
            = DateTimeFormatter.ofPattern("d MMM uuuu H:mm:ss z", Locale.ENGLISH);

    String firstDateString = "11 May 2018 21:03:51 GMT";
    String secondDateString = "2018-05-11T21:03:51Z";

    Instant firstInstant = firstFormatteer.parse(firstDateString, Instant::from);
    Instant seoncdInstant = Instant.parse(secondDateString);

    System.out.println("The strings are parsed into " + firstInstant + " and " + seoncdInstant);

输出为:

  

字符串被解析为2018-05-11T21:03:51Z和2018-05-11T21:03:51Z

您来自两个服务的字符串具有两种不同的格式,而您最好的选择是以两种不同的方式处理它们。首先,定义一个与格式匹配的格式器。第二个是ISO 8601格式。 Instant在不使用任何显式格式化程序的情况下解析此格式,因此在这里我们不需要定义一个。

要进行比较,例如:

    if (firstInstant.isBefore(seoncdInstant)) {
        System.out.println("The first date and time comes first");
    } else if (firstInstant.equals(seoncdInstant)) {
        System.out.println("The date and time is the same");
    }
  

日期和时间相同

Instant类是Date类的现代替代品,它代表时刻。

Date类的设计很差,并且SimpleDateFormat非常麻烦,幸运的是,它们都已经过时了。我建议您避免使用它们,而应使用现代Java日期和时间API java.time。

链接: Oracle tutorial: Date Time解释了如何使用java.time。