无法解析的MMM-dd-yyyy

时间:2016-05-08 06:01:03

标签: java date parsing

我将直接回答我的问题。我想知道为什么我不能将一个完整的MMM-dd-yyyy解析为yyyy-MM-dd(java.sql.Date格式)?关于如何将String转换为(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);
        }
    }

谢谢

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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驱动程序处理它

答案 2 :(得分:0)

尝试类似:

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
 }

答案 3 :(得分:0)

您的例子并非无法解决。我将破折号从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”)