Java 在转换字符串值时对使用SimpleDataFormat感到困惑

Java 在转换字符串值时对使用SimpleDataFormat感到困惑,java,date,simpledateformat,Java,Date,Simpledateformat,我试图获取一个文本框字段(由字符串wkCreation字段表示),并将数据转换为“YYYY-MM-DD”格式的日期字段。这是我现在使用的代码SimpleDateFormat: SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); try { Date convertdate = format.parse(wkCreation); wkCreationFormat = format.format(convertd

我试图获取一个文本框字段(由字符串
wkCreation
字段表示),并将数据转换为“YYYY-MM-DD”格式的日期字段。这是我现在使用的代码
SimpleDateFormat

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
    Date convertdate = format.parse(wkCreation);
    wkCreationFormat = format.format(convertdate) ;
    System.out.println("Convertdate field  = " + convertdate);
    System.out.println("Creation Format field = " + wkCreationFormat);
} 
catch (ParseException e) {
    e.printStackTrace();
}

如果用户以与
SimpleDateFormat
模式相同的格式输入日期,那么这似乎是我实现此功能的唯一方法,这确实违背了我所想的目的。我正在尝试将“mm/dd/yy”或“mm/dd/yyyy”格式的内容转换为“yyy-mm-dd”格式。除了常识,我还想念她什么?我认为我对
convertdate
的定义是错误的,但不知道SimpleDateFormat的目的是将字符串转换为日期,这并不像您想象的那么简单。如果我有日期
01/02/2015
你怎么知道是2月1日还是1月2日。答案是,您不知道,您需要额外的提示(输入)来执行正确的转换格式

您可以编写自己的格式,支持多种格式,例如类似于:

package q34776322;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class MultiDateFormat {

    String[] supportedFormats;

    public MultiDateFormat(String... formats) {
        supportedFormats = Arrays.copyOf(formats, formats.length);
    }

    public Date parse(String dateString) {
        Date foundDate = null;
        for (String format : supportedFormats) {
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            try {
                Date tmp = sdf.parse(dateString);
                if (foundDate != null) {
                    // correct parsing, but it was at parsed before => error
                    throw new IllegalArgumentException("Unparsable date: '" + dateString + "' (multiple pattern matches)");
                } else {
                    foundDate = tmp;
                }
            } catch (ParseException pe) {

            }
        }
        if (foundDate == null) {
            throw new IllegalArgumentException("Unparsable date: '" + dateString + "' (no pattern match)");
        }
        return foundDate;
    }


    public static void main(String[] args) {
        MultiDateFormat mdf = new MultiDateFormat("yyyy-MM-dd", "dd/MM/yyyy");
        mdf.parse("2015-02-01"); // February 1st
        mdf.parse("01/02/2015"); // February 1st again

        mdf = new MultiDateFormat("MM/dd/yyyy", "dd/MM/yyyy");
        try {
            mdf.parse("01/02/2015");
        } catch (Exception e) {
            System.out.println("Expected exception");
        }
    }

}

这基本上是在尝试所有格式-如果没有匹配或有多个匹配,就会抛出异常…

SimpleDataFormat的目的是将字符串转换为日期,这并不像您想象的那么简单。如果我有日期
01/02/2015
你怎么知道是2月1日还是1月2日。答案是,您不知道,您需要额外的提示(输入)来执行正确的转换格式

您可以编写自己的格式,支持多种格式,例如类似于:

package q34776322;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class MultiDateFormat {

    String[] supportedFormats;

    public MultiDateFormat(String... formats) {
        supportedFormats = Arrays.copyOf(formats, formats.length);
    }

    public Date parse(String dateString) {
        Date foundDate = null;
        for (String format : supportedFormats) {
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            try {
                Date tmp = sdf.parse(dateString);
                if (foundDate != null) {
                    // correct parsing, but it was at parsed before => error
                    throw new IllegalArgumentException("Unparsable date: '" + dateString + "' (multiple pattern matches)");
                } else {
                    foundDate = tmp;
                }
            } catch (ParseException pe) {

            }
        }
        if (foundDate == null) {
            throw new IllegalArgumentException("Unparsable date: '" + dateString + "' (no pattern match)");
        }
        return foundDate;
    }


    public static void main(String[] args) {
        MultiDateFormat mdf = new MultiDateFormat("yyyy-MM-dd", "dd/MM/yyyy");
        mdf.parse("2015-02-01"); // February 1st
        mdf.parse("01/02/2015"); // February 1st again

        mdf = new MultiDateFormat("MM/dd/yyyy", "dd/MM/yyyy");
        try {
            mdf.parse("01/02/2015");
        } catch (Exception e) {
            System.out.println("Expected exception");
        }
    }

}

这基本上是尝试所有格式-如果没有适合或有多个适合,就会抛出异常…

您离正确的代码只差一步。您所遗漏的是,正如您所说,您正在处理两种不同的日期格式:

我正在尝试将'mm/dd/yy'或'mm/dd/yyyy'格式的内容转换为'yyyy-mm-dd'格式

在这种情况下,您只需要两个大致如下的格式化程序:

SimpleDateFormat inputParser = new SimpleDateFormat("MM/dd/yyyy");
SimpleDateFormat outputFormatter = new SimpleDateFormat("yyyy-MM-dd");
try {
  Date convertdate = inputParser.parse(wkCreation);
  wkCreationFormat = outputFormatter.format(convertdate) ;
  System.out.println("Convertdate field  = " + convertdate);
  System.out.println("Creation Format field = " + wkCreationFormat);
一个用来解析期望的输入,另一个用来解析期望的输出


要解析输入,您当然需要为用户提供灵活性或明确的预期格式说明。

您离正确的代码只差一步。您所遗漏的是,正如您所说,您正在处理两种不同的日期格式:

DateTimeFormatter formatterOutput = DateTimeFormatter.ISO_LOCAL_DATE ;
String output = localDate.format( formatterOutput );
我正在尝试将'mm/dd/yy'或'mm/dd/yyyy'格式的内容转换为'yyyy-mm-dd'格式

在这种情况下,您只需要两个大致如下的格式化程序:

SimpleDateFormat inputParser = new SimpleDateFormat("MM/dd/yyyy");
SimpleDateFormat outputFormatter = new SimpleDateFormat("yyyy-MM-dd");
try {
  Date convertdate = inputParser.parse(wkCreation);
  wkCreationFormat = outputFormatter.format(convertdate) ;
  System.out.println("Convertdate field  = " + convertdate);
  System.out.println("Creation Format field = " + wkCreationFormat);
一个用来解析期望的输入,另一个用来解析期望的输出

要解析输入,您当然需要为用户提供灵活性或明确的预期格式说明。

字符串不是日期时间对象
DateTimeFormatter formatterOutput = DateTimeFormatter.ISO_LOCAL_DATE ;
String output = localDate.format( formatterOutput );
字符串不是日期时间对象。如果有一个字符串是日期时间值的文本表示形式,则必须将该值解析为日期时间对象。然后使用该日期-时间对象生成另一个字符串,作为日期-时间值的另一种文本表示形式,采用另一种格式。因此,一种格式定义用于解析,另一种格式定义用于生成

无法解析任何日期时间格式 从逻辑上讲,无法使用任何可能的格式从字符串解析日期值。例如:
1/2/3
…哪个是月份、月份的哪一天、缩写的年份?必须为数据输入用户定义一种或多种预期格式。进行一次解析尝试,捕获预期的解析异常,重复,直到一次成功。这在StackOverflow上已经讨论过很多次了,所以如果想法不清楚,请搜索示例代码

java.time 您使用的是麻烦的旧日期时间类,现在已被Java8和更高版本中的框架所取代

该框架包括一个类,用于表示只包含日期的值,而不包含一天中的时间或时区

必须使用编码模式指定预期输入的两种格式。这些代码与java.text.simpleDataFormat的代码类似,但并不完全相同。一定要仔细研究这份文件

String input = "12/01/2015" ;
DateTimeFormatter formatterInput = DateTimeFormatter.ofPattern( "MM/dd/yyyy" );
try {
    LocalDate localDate = LocalDate.parse( input , formatterInput );
}  catch ( DateTimeParseException e ) {
       // FIXME: handle exception
}
您所需的输出格式正好符合标准。time框架使用这个标准,因为它默认解析和生成日期时间值的文本表示。该类保存各种ISO 8601格式的常量,包括所需的格式

DateTimeFormatter formatterOutput = DateTimeFormatter.ISO_LOCAL_DATE ;
String output = localDate.format( formatterOutput );
字符串不是日期时间对象 字符串不是日期时间对象。如果有一个字符串是日期时间值的文本表示形式,则必须将该值解析为日期时间对象。然后使用该日期-时间对象生成另一个字符串,作为日期-时间值的另一种文本表示形式,采用另一种格式。因此,一种格式定义用于解析,另一种格式定义用于生成

无法解析任何日期时间格式 从逻辑上讲,无法使用任何可能的格式从字符串解析日期值。例如:
1/2/3
…哪个是月份、月份的哪一天、缩写的年份?必须为数据输入用户定义一种或多种预期格式。进行一次解析尝试,捕获预期的解析异常,重复,直到一次成功。这在StackOverflow上已经讨论过很多次了,所以如果想法不清楚,请搜索示例代码

java.time 您使用的是麻烦的旧日期时间类,现在已被Java8和更高版本中的框架所取代

该框架包括一个类,用于表示只包含日期的值,而不包含一天中的时间或时区

必须使用编码模式指定预期输入的两种格式。这些代码与java.text.simpleDataFormat的代码类似,但并不完全相同。一定要仔细研究这份文件

String input = "12/01/2015" ;
DateTimeFormatter formatterInput = DateTimeFormatter.ofPattern( "MM/dd/yyyy" );
try {
    LocalDate localDate = LocalDate.parse( input , formatterInput );
}  catch ( DateTimeParseException e ) {
       // FIXME: handle exception
}
您想要的输出格式