【问题标题】:How to parse date string EEE MMM dd to yyyy-MM-dd in java [duplicate]如何在java中将日期字符串EEE MMM dd解析为yyyy-MM-dd [重复]
【发布时间】:2019-10-09 22:52:15
【问题描述】:

我在这个模式中有日期 EEEEE MMMMM yyyy HH:mm:ss.SSSZ,我想在 java 中将它转换为 yyyy-MM-dd 格式,我尝试了以下方法但我得到了这个例外java.text.ParseException: Unparseable date:

   SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy");
    String dateInString = "Sun Oct 01 00:00:00 EDT 2017";

    try {

        Date date = formatter.parse(dateInString);
        System.out.println(date);
        System.out.println(formatter.format(date));

    } catch (ParseException e) {
        e.printStackTrace();
    }

有人可以帮我解决这个问题吗?

谢谢。

【问题讨论】:

  • EEEEE 你的意思是DDDDD,对吧?
  • 在两个单独的步骤中解析和格式化,您需要一个代表每个模式的格式化程序才能使其工作
  • 仅供参考,java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 等麻烦的日期时间类现在已被 java.time 类所取代。大多数 java.time 功能在 ThreeTen-Backport 项目中被反向移植到 Java 6 和 Java 7。进一步适用于ThreeTenABP 中的早期 Android (How to use ThreeTenABP…
  • 首先我建议你不要使用SimpleDateFormatDate。这些类设计不佳且早已过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time APIZonedDateTime(或OffsetDateTime)和DateTimeFormatter
  • Sun Oct 01 00:00:00 EDT 2017 在模式EEEEE MMMMM yyyy HH:mm:ss.SSSZ不是。它也不在模式dd-MMM-yyyy 中,因此无法使用具有后一种模式的格式化程序进行解析。

标签: java date java-8


【解决方案1】:

从 java-8 中,您可以使用 ZonedDateTime 与您的输入日期模式,即 EEE MMM dd HH:mm:ss zzz yyyy

String dateInString = "Sun Oct 01 00:00:00 EDT 2017";

ZonedDateTime time = ZonedDateTime.parse(dateInString,DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy"));
System.out.println(time.toLocalDate());   //2017-10-01

默认情况下,LocalDate 在 ISO-8601 日历系统中没有时区,例如 2007-12-03。

【讨论】:

    【解决方案2】:

    您已将格式化程序定义为“日期、月份、年份”的概念,然后您尝试要求它解析一个根本不是这种格式的字符串。你需要制作一个可以格式化Sun Oct 01 00:00:00 EDT 2017的格式化程序,而dd-MMM-yyyy显然不是。 javadoc of SimpleDateFormat 会告诉您需要使用哪种字母组合。

    一旦你有了它,就很容易:用这个新的格式化程序解析,然后用你的旧格式化程序(dd-MMM-yyyy)调用.format

    【讨论】:

      【解决方案3】:

      您不能对解析和格式化使用相同的格式化程序。看到这个答案:https://stackoverflow.com/a/999191

      【讨论】:

        【解决方案4】:

        你双重创建 DateFormat 一次解析和一次格式化

        DateFormat dfParse = new SimpleDateFormat("EEEEE MMMMM yyyy HH:mm:ss.SSSZ");
        DateFormat dfFormat = new SimpleDateFormat("yyyy-MM-dd");
        dfFormat.format(dfParse.parse("Sun Oct 01 00:00:00 EDT 2017"))
        

        【讨论】:

          猜你喜欢
          • 2021-04-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-29
          相关资源
          最近更新 更多