【问题标题】:How to convert two different string dates into a single date format如何将两个不同的字符串日期转换为单个日期格式
【发布时间】:2020-01-16 10:58:15
【问题描述】:

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

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

【问题讨论】:

  • dataStore.get 操作有什么作用?你确定它真的得到一个字符串日期吗?您的输入似乎是一个字符串日期。另外,请避免使用SimpleDateFormatDate,并使用java.time 类中的适当类。
  • 您似乎在 cmets 中对给定的答案解释了您的问题,如果您编辑您的问题而不是让每个人都更清楚您的问题不是更好吗?
  • 我建议你不要使用SimpleDateFormatDate。这些类设计不佳且早已过时,尤其是前者,尤其是出了名的麻烦。而是使用OffsetDateTimeInstantDateTimeFormatter,均来自java.time, the modern Java date and time API

标签: java datetime-format datetime-comparison


【解决方案1】:

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。

【讨论】:

    【解决方案2】:

    这里:

    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 ...”(不以年份开头),第二个使用“-”而不是“”作为初始日期的分隔符。

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

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

    【讨论】:

    • 好吧,我对问题的字符串进行了硬编码。实际上,我实际上拉了这些日期。所以我的想法是,如果两种不同的日期格式,我如何断言这些日期?这就是为什么我的想法是将它们转换为一种日期格式,然后断言
    【解决方案3】:

    我遇到的问题是它在解析中出错并出现异常 我想知道我是不是做错了什么。

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

    例如:用于解析和格式化 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
    

    【讨论】:

    • 嗨,Paresh,好的,所以对于这个问题,我对字符串进行了硬编码。实际上,我从不同的服务中获取这两个日期,并且它们都以不同的方式输出日期(我的硬编码字符串显示它们的格式)。我会看看你的代码,但希望这更有意义?
    猜你喜欢
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 2015-07-13
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多