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
}
您想要的输出格式