我将直接回答我的问题。我想知道为什么我不能将一个完整的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);
}
}
谢谢
答案 0 :(得分:1)
answer by MadProgrammer是正确的。您必须定义格式模式以适合输入数据字符串的格式。
通过使用java.time框架,您可以首先避免此问题。
java.time框架内置于Java 8及更高版本(也支持后端移植到Java 6& 7和Android)。这些类取代了旧的麻烦遗留日期时间类(java.util.Date/.Calendar)。
您的输入字符串很明显是标准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”)