【问题标题】:Unparseable MMM-dd-yyyy无法解析的 MMM-dd-yyyy
【发布时间】:2016-05-08 06:01:02
【问题描述】:

我会直接回答我的问题。我想知道为什么我不能将 fromat MMM-dd-yyyy 解析为 yyyy-MM-dd (java.sql.Date 格式)?关于如何将字符串转换为 (yyyy-MM-dd) 格式的任何建议?

代码如下:

public DeadlineAction(String deadline){
        putValue(NAME, deadline);
        deadLine = deadline;
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy MM dd");
        try {
            finalDate = (Date) formatter.parse(deadLine);           
        }catch(ParseException e) {
            JOptionPane.showMessageDialog(null, e.getMessage(),"Error",JOptionPane.ERROR_MESSAGE);
        }
    }

谢谢

【问题讨论】:

  • 你要解析什么值?
  • 你可以,但你需要先解析成“MMM-dd-yyyy”,然后再解析成“yyyy-MM-dd”
  • 另外,yyyy MM ddMM-dd-yyyy 之间存在差异,但您正试图用第一个解析第二个...
  • 我现在明白了。谢谢你的回答先生:)

标签: java date parsing


【解决方案1】:

基本上,您不能使用MMM-dd-yyyy 的格式来解析String 格式的yyyy MM dd,它只是没有意义,您需要一个格式化程序来解析值,而另一个格式化程序来格式化它例如

SimpleDateFormat to = new SimpleDateFormat("yyyy MM dd");
SimpleDateFormat from = new SimpleDateFormat("MMM-dd-yyyy");

Date date = from.parse(deadLine);
String result = to.format(date)

需要问的问题是,你为什么要打扰。如果您打算将此值放入数据库,您应该创建java.sql.Date 的实例(来自java.util.Date)并使用PreparedStatement#setDate 将其应用于您的查询,然后让JDBC 驱动程序处理它

【讨论】:

  • 您好,先生。就像我说的,我无法将“deadLine”变量解析为日期格式。我的程序在 parse 语句处停止。
  • 我认为这是因为您尝试使用格式为yyyy-MM-dd 的解析器解析格式为MMM-dd-yyyy 的值,其中哪一部分有任何意义?您是否尝试使用一个格式化程序将 String 解析为 Date 并使用另一个格式化程序将其格式化为新格式?您尝试解析的实际值是什么?
  • 我想我现在有了解析的想法。谢谢你的回答先生。这是一个很大的帮助!
  • 先生,它现在工作了。我对解析有错误的认识。谢谢!
【解决方案2】:

answer by MadProgrammer 是正确的。您必须定义格式模式以适应输入数据字符串的格式。

你可以通过使用 java.time 框架来避免这个问题。

java.time

java.time 框架内置于 Java 8 及更高版本(也向后移植到 Java 6 和 7 以及 Android)。这些类取代了旧的麻烦的遗留日期时间类 (java.util.Date/.Calendar)。

ISO 8601

您的输入字符串显然是标准的ISO 8601 格式,YYYY-MM-DD 如2016-01-23

在解析/生成表示日期时间值的字符串时,java.time 类默认使用ISO 8601 格式。 因此无需指定格式模式。

解析字符串

对于没有时间和时区的仅日期值,请使用LocalDate 类。

LocalDate localDate = LocalDate.parse( "2016-01-23" );

生成字符串

要生成表示该LocalDate 对象值的字符串,只需调用toString 以获取ISO 8601 格式的字符串。

String output = localDate.toString(); // 2016-01-23

对于其他格式,请使用java.time.format 包。通常最好让 java.time 自动本地化为 Locale 定义的用户人类语言和文化规范。

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM );
Locale locale = Locale.CANADA_FRENCH;
formatter = formatter.withLocale( locale );
String output = localDate.format( formatter );

或者您可以指定自己的特定模式。请注意,您仍应指定 Locale 来确定月份名称或日期名称等方面。这是问题中似乎提出的模式的演示(不确定,因为问题不清楚)。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "MMM-dd-yyyy" );
Locale locale = Locale.US;
formatter = formatter.withLocale( locale );
String output = localDate.format( formatter );

【讨论】:

    【解决方案3】:

    尝试类似:

    try {
        final String deadLine = "Oct-12-2006";
        SimpleDateFormat formatter = new SimpleDateFormat("MMM-dd-yyyy");//define formatter for yout date time
        Date finalDate = formatter.parse(deadLine);//parse your string as Date
        SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd");// define your desired format
        System.out.println(formatter2.format(finalDate));//format the string to your desired date format
     } catch (Exception e) {
        //handle
     }
    

    【讨论】:

      【解决方案4】:

      您的示例并非不可解析。我将破折号从 MMM-dd-yyyy 删除到 MMM dd yyyy。如果需要,您可以将它们放回去。我还删除了任何额外的代码以使解决方案清晰。

      import java.sql.Date;
      import java.text.ParseException;
      import java.text.SimpleDateFormat;
      
      public DeadlineAction(String deadline){
      
          //if deadline has format similar to "December 19 2011"
          try {
               finalDate = new java.sql.Date(
                      ((java.util.Date) new SimpleDateFormat("MMM dd yyyy").parse(deadline)).getTime()); 
      
          }catch(ParseException e) {
             //Your exception code
             e.printStackTrace();
          }
      }
      

      这适用于几乎所有到 sqlDate 的转换。只需将 SimpleDateFormat("MMM dd yyyy") 更改为您需要的。

      示例:new SimpleDateFormat("MMM-yyyy-dd").parse("NOVEMBER-2012-30")

      【讨论】:

      • 感谢您的贡献。我无法回答有关另一种格式的问题。同样使用SimpleDateFormat 是一个糟糕的建议,该类不仅早已过时(以及java.utilDatejava.sql.Date),而且还出了名的麻烦。
      • 原问题:我想知道为什么我不能将一个fromat MMM-dd-yyyy解析成yyyy-MM-dd(java.sql.Date格式)?
      • 原始问题:我想知道为什么我不能将一个fromat MMM-dd-yyyy 解析为yyyy-MM-dd(java.sql.Date 格式)?简单地说,如何从这种格式解析:December(MMM) - 19(dd) - 2011(yyyy) 到 java.sql.Date 即 yyyy-MM-dd。我提供的答案使用了问题或示例代码中提到或使用的 java 导入。我肯定回答了同样的问题,我再说一遍,同样的格式是阿德里安·奎瓦达问的。 SimpleDateFormat 用于问题示例代码,java.sql.Date 格式用于问题和问题示例代码。此外,对所有人来说都不会过时和麻烦。
      • 我只是没有明白删除破折号的意义,这就是我所说的“不同格式”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多