【问题标题】:Convert "Friday, February 1, 2013" to "2013-02-01"将“2013 年 2 月 1 日星期五”转换为“2013-02-01”
【发布时间】:2013-02-03 20:47:29
【问题描述】:

如何在 Java 中执行这种转换?

目前,我正在做:

public static String formatDate(String strDateToFormat) {
    try {
        SimpleDateFormat sdfSource = new SimpleDateFormat("EEEE, MMMM DD, YYYY");
        Date date = sdfSource.parse(strDateToFormat);
        SimpleDateFormat sdfDestination = new SimpleDateFormat("yyyy-MM-dd");
        return sdfDestination.format(date);
    } catch (ParseException pe) {
        System.err.println("Parse Exception : " + pe);
    }

    return null;
}

但是,这会导致格式不正确。它给了我以下输出:

Friday, February 1, 2013 > 2013-01-04
Thursday, January 31, 2013 > 2013-01-03

【问题讨论】:

  • 为什么要多次重复输出两个值?
  • 将“DD”改为“d”,将“YYYY”改为“yyyy”
  • 我会将System.err.println("Parse Exception : " + pe); 替换为pe.printStackTrace();。或者,更好的是,从您的方法中抛出该异常。

标签: java date simpledateformat


【解决方案1】:

您在解析部分使用DD,即一年中的某一天。你想要dd。您可能还想要yyyy(年)而不是YYYY(周年)。 (在大多数情况下,它们的值相同,但并非总是如此。)

【讨论】:

    【解决方案2】:

    您在解析部分使用 DD,即一年中的某一天。你想要 dd 代替。 在 yyyy 中也更改 YYYY。

    您可以在此处找到所有模式。

    http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

    【讨论】:

      【解决方案3】:

      您的代码有两个主要问题,现有的答案已经解决了其中一个问题。第二个更危险的问题是,不使用LocaleSimpleDateFormat,这是Locale 敏感类型。由于您的日期时间字符串是英文的,请确保使用Locale.ENGLISH 或其他一些英文-Locale。因此,正确的初始化应该是:

      SimpleDateFormat sdfSource = new SimpleDateFormat("EEEE, MMMM d, y", Locale.ENGLISH);
      

      查看Never use SimpleDateFormat or DateTimeFormatter without a Locale 了解更多信息。另外,请注意单个d,对于解析,它可以同时满足月份日期的一位数和两位数表示。同样,单个y 可以同时满足两位数和四位数的年份表示。

      切换到现代日期时间 API

      请注意,java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用 2014 年 3 月随 Java SE 8 发布的modern Date-Time API*

      使用现代日期时间 API java.time 的解决方案

      import java.time.LocalDate;
      import java.time.format.DateTimeFormatter;
      import java.util.Locale;
      
      public class Main {
          public static void main(String[] args) {
              String input = "Friday, February 1, 2013";
              DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEEE, MMMM d, u", Locale.ENGLISH);
              LocalDate date = LocalDate.parse(input, dtf);
              System.out.println(date);
          }
      }
      

      输出:

      2013-02-01
      

      ONLINE DEMO

      一些注意事项:

      1. 在这里,您可以使用y 代替uI prefer u to y
      2. LocalDate#toString 为您提供 [ISO-8601 格式] 的 String,这与您期望的格式完全相同。因此,您无需显式格式化 LocalDate 即可获得此格式的 String

      Trail: Date Time 了解有关现代日期时间 API 的更多信息。


      * 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-12
        • 2015-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-03
        相关资源
        最近更新 更多