我想在java中使用SimpleDateFormat将日期转换为94 NOV 21到94/11/21。
我创建了一个简单的日期格式
new SimpleDateFormat("yy MMM dd")
解析94 NOV 21。但它无法解析什么是正确的模式?
在我的代码中我有许多标准格式的日期,我通过将它们全部添加到一个列表(DateFormats)并将传入日期与此列表进行比较来处理非标准日期(R 250051Z FEB 99) )在异常块内工作正常但我的主要问题是我无法使用新的SimpleDateFormat(“yy MMM dd”)解析94 NOV 21。最后的System.out语句转到异常块但是应该用new处理SimpleDateFormat(“yy MMM dd”)但这不起作用。
import java.util.List;
import java.util.Locale;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
import java.nio.charset.StandardCharsets;
import org.apache.commons.lang.StringUtils;
public class Test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(getDate("August 21 99"));
System.out.println(getDate("21 August 1999"));
System.out.println(getDate("94 NOV 21"));
}
private static String getDate(String inputString) {
if (!StringUtils.isEmpty(inputString)) {
String input = inputString.replaceAll("[^A-Za-z0-9 ]", " ");
// System.out.println("input to formatter>>" + input);
String requiredDate = "";
SimpleDateFormat requiredDateFormat = new
SimpleDateFormat("MM/dd/yy");
List<SimpleDateFormat> dateFormats = new
ArrayList<SimpleDateFormat>() {
{
add(new SimpleDateFormat("MMM dd yyyy", Locale.US));
add(new SimpleDateFormat("MMM dd yy", Locale.US));
add(new SimpleDateFormat("yy MMM yy", Locale.US));
add(new SimpleDateFormat("dd MMM yyyy", Locale.US));
add(new SimpleDateFormat("M dd yyyy", Locale.US));
add(new SimpleDateFormat("dd M yyyy", Locale.US));
add(new SimpleDateFormat("dd MM yy", Locale.US));
add(new SimpleDateFormat("MM dd yy", Locale.US));
add(new SimpleDateFormat("M dd yyyy hh mm ss a",
Locale.US));
add(new SimpleDateFormat("dd M yyyy hh mm ss a",
Locale.US));
}
};
Date date = null;
for (SimpleDateFormat format : dateFormats) {
// System.out.println("in for loop");
try {
format.setLenient(false);
date = format.parse(input.trim());
if (date != null) {
requiredDate =
requiredDateFormat.format(date).toString();
break;
}
} catch (ParseException e) {
String day = inputString.subSequence(2, 4).toString();
String monYear = inputString.substring(10);
String dateToConvert = day + " " + monYear;
SimpleDateFormat customDateFormatter = new SimpleDateFormat("dd MMM yy");
try {
date = customDateFormatter.parse(dateToConvert);
if (date != null) {
requiredDate = requiredDateFormat.format(date).toString();
break;
}
} catch (Exception ex) {
requiredDate = null;
}
// System.out.println("Handle separately");
}
}
System.out.println("requiredDate>>>" + requiredDate);
return requiredDate;
}
else {
return null;
}
}
}
答案 0 :(得分:1)
您的格式在Ideone上运行正常。
我怀疑您使用的是非英语默认语言环境。尝试强制在美国语言环境中解析日期:
System.out.println( // Works.
new SimpleDateFormat("yy MMM dd", Locale.US).parse("94 NOV 21"));
System.out.println( // Does not work - expects NOV. (with a period).
new SimpleDateFormat("yy MMM dd", Locale.FRANCE).parse("94 NOV 21"));
答案 1 :(得分:0)
想象一下如果发生这种情况会发生什么。
04 12 05正在尝试解析?
是2005年12月4日? 2004年5月12日,2005年4月12日? 好的答案是,是俄罗斯轮盘赌,因为你正在使用多个格式化程序迭代数组列表...
总结:
答案 2 :(得分:0)
Agent
在上述代码中,yy表示年份,即年份的最后两位数,MMM表示缩写的月份,即3个字母的月份,d表示月份的日期。
来源:https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html