我有一个字符串,可能包含以下任何格式的日期:
2001-01-05 (yyyy-mm-dd)
2001/01/05 (yyyy/mm/dd)
01/05/2001 (dd/mm/yyyy)
01-05-2001 (dd-mm-yyyy)
2001 january 5
2001 5 january
january 5 2001
5 january 2001
january 5
5 january
我希望能够解析特定字符串并从中提取Date对象。
我的方法如下:
String[] date_formats = {
"yyyy-MM-dd",
"yyyyy/MM/dd",
"dd/MM/yyyyy",
"dd-MM-yyyy",
"yyyy MMM dd",
"yyyy dd MMM",
"dd MMM yyyy",
"dd MMM",
"MMM dd",
"dd MMM yyyy"};
String output_date = null;
for (String formatString : date_formats)
{
try
{
Date mydate = new SimpleDateFormat(formatString).parse(token);
SimpleDateFormat outdate = new SimpleDateFormat("yyyyMMdd");
output_date = outdate.format(mydate);
break;
}
catch (ParseException e) {
System.out.println("Next!");
}
}
这似乎没有按预期工作。特别是2001年1月5日等日期。我该如何做呢?
答案 0 :(得分:6)
使用SimpleDateFormat.setLenient(false)
。这样,它就不会尝试解析不是所需格式的日期。
答案 1 :(得分:1)
您需要在date_formats
数组中包含您预期会出现的格式类型的所有格式。
查看SimpleDateFormat
javadocs。
查看javadocs中的示例。
2001-01-05 - yyyy-MM-dd
2001/01/05 - yyyy/MM/dd
01/05/2001 - dd/MM/yyyy
01-05-2001 - dd-MM-yyyy
2001 january 5 - yyyy MMMMM d
2001 5 january - yyyy d MMMMM
january 5 2001 - MMMMM d yyyy
5 january 2001 - d MMMMM yyyy
january 5 - MMMMM d
5 january - d MMMMM
答案 2 :(得分:1)
而不是测试“yyyy-MM-dd”,然后是“yyyy / MM / dd”,然后是“yyyy.MM.dd”(在许多国家使用)等,你可以从
开始token = token.replaceAll("-|\\.", "/");
这样所有点和短划线都会替换为“/”,您可以减少格式和尝试次数。
答案 3 :(得分:0)
这是你在找什么?
String[] date_formats = {
"y-M-d",
"y/M/d",
"d/M/y",
"d-M-y",
"y M d",
"y d M",
"d M y",
"d M",
"M d",
"d M y"};
String output_date = null;
for (String formatString : date_formats)
{
try
{
SimpleDateFormat sf = new SimpleDateFormat(formatString);
output_date = "5 January 2001";
Date yourDate = sf.parse(output_date);
break;
}
catch (ParseException e) {
System.out.println("Next!");
}
}
答案 4 :(得分:0)
您可以使用
提取日期字符串String mydate = new SimpleDateFormat(formatString).format(new Date());
新日期()会返回当天的日期,您可以将其更改为您想要的任何日期。
所以,如果你改变这样的代码:
String[] date_formats = {
"y-M-d",
"y/M/d",
"d/M/y",
"d-M-y",
"y M d",
"y d M",
"d M y",
"d M",
"M d",
"d M y"};
for (String formatString : date_formats)
{
String mydate = new SimpleDateFormat(formatString).format(new Date());
System.out.println(mydate);
}
你最终会得到这些:
2013-10-2
2013/10/2
2/10/2013
2-10-2013
2013 10 2
2013 2 10
2 10 2013
2 10
10 2
2 10 2013
答案 5 :(得分:0)
为“2001年1月5日”
添加此日期格式"dd MMMMM YYYY"
答案 6 :(得分:0)
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String dateInString = formatter.format(date);
LOG.warn("date in String "+dateInString);
确保MM是资本
答案 7 :(得分:0)
Kayamans回答是有效的,这就是它在代码片段中的样子,因此您可以自己轻松地测试它(从我自己的代码直接复制粘贴):
static String[] date_formats = {
"yyyy-MM-dd",
"yyyy/MM/dd",
"dd/MM/yyyy",
"dd-MM-yyyy",
"yyyy MMM dd",
"yyyy dd MMM",
"dd MMM yyyy",
"dd MMM yyyy"};
static String[] dates = {
"21/02/2012",
"21-02-2012",
"21-2-2012",
"21 Feb 2012",
"Feb 21 2012",//will not be parsed
"21 februari 2012" //Dutch
};
@Test
public void test(){
for(String date : dates) {
parseDate(date);
System.out.print("----------------");
}
}
private void parseDate(String token){
Locale dutch = new Locale("nl", "NL");
for (String formatString : date_formats)
{
try
{
SimpleDateFormat format = new SimpleDateFormat(formatString, dutch);
format.setLenient(false);
Date mydate = format.parse(token);
System.out.println(mydate.toString());
break;
}
catch (ParseException e) {
System.out.println("Next!");
}
}
}