-3

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

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);
4

3 回答 3

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
于 2019-09-15T09:19:22.527 回答
0

这里:

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

该格式表示:4 年数字空格 2 天数字空格 2 个月数字 DASH 等等。

事情是:你的字符串日期都不是:

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

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

答:您必须使用与预期日期字符串真正匹配的模式,请参阅此处了解规格。请注意,例如,您将需要使用M来匹配“May”,小写m是关于数字,而不是单词!

请注意:第二个示例是 ISO 日期,而DateTimeFormatter已经为这些日期预定义了格式化程序!(所以要小心重新发明轮子)

于 2019-09-15T09:19:51.457 回答
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 教程:解释如何使用 java.time 的日期时间。

于 2019-09-15T11:05:20.127 回答