我有个问题.我试图将一些字符串转换为日期,我不知道日期到达的格式.
它可能会yyyy.mm.dd hh:mm:ss或MM.dd.yy hh:mm:ss等等.
如何将这些字符串转换为Date?我试过这个:
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
Date d = (Date)formatter.parse(someDate);
Run Code Online (Sandbox Code Playgroud)
但是当我打印出someDate时,它打印出来像这样:2010-08-05 12:42:48.638 CEST这意味着yyyy.mm.dd hh:mm:ss,但是当我运行上面的代码时,日期对象现在变得Sat Jan 31 00:42:48 CET 11奇怪,至少可以说.
有关如何正确格式化字符串的想法吗?
Jus*_*tin 49
你不能!
如果您有日期,2010-08-05那么它可以是2010年8月5日或2010年5月8日 - 您需要知道日期格式(或者至少优先考虑一种格式),以区分它们.
Eya*_*der 11
我同意Kragen的说法,一般情况下没有正确的解决方案.但是,如果满足以下条件,您可以使用以下解决方案:
您有一套所有可能的格式
格式之间没有歧义; 其中两个不能成功解析日期表达式.
考虑以下解决方案,它迭代可能的格式列表.此解决方案利用ThreadLocal,以便在多线程环境中使日期解析有效(请记住,这SimpleDateFormat不是线程安全的):
public class FlexibleDateParser {
private List<ThreadLocal<SimpleDateFormat>> threadLocals = new ArrayList<ThreadLocal<SimpleDateFormat>>();
public FlexibleDateParser(List<String> formats, final TimeZone tz){
threadLocals.clear();
for (final String format : formats) {
ThreadLocal<SimpleDateFormat> dateFormatTL = new ThreadLocal<SimpleDateFormat>() {
protected SimpleDateFormat initialValue() {
SimpleDateFormat sdf = new SimpleDateFormat(format);
sdf.setTimeZone(tz);
sdf.setLenient(false);
return sdf;
}
};
threadLocals.add(dateFormatTL);
}
}
public Date parseDate(String dateStr) throws ParseException {
for (ThreadLocal<SimpleDateFormat> tl : threadLocals) {
SimpleDateFormat sdf = tl.get();
try {
return sdf.parse(dateStr);
} catch (ParseException e) {
// Ignore and try next date parser
}
}
// All parsers failed
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
如前所述,您至少需要一个有序的模式候选列表.有了这个,Apache DateUtils有一个parseDate(String dateString, String[] patterns)方法可以让你轻松地在日期字符串上试用一个模式列表,并通过匹配的第一个模式解析它:
public static Date parseDate(String str,
String[] parsePatterns)
throws ParseException
Run Code Online (Sandbox Code Playgroud)
通过尝试各种不同的解析器来解析表示日期的字符串.
解析将依次尝试每个解析模式.如果解析整个输入字符串,则认为解析成功.如果没有解析模式匹配,则抛出ParseException.
解析器将对解析日期宽容.
这是一个基于美国日期格式的快速而肮脏的解决方案.
public Date parseDate(String strDate) throws Exception
{
if (strDate != null && !strDate.isEmpty())
{
SimpleDateFormat[] formats =
new SimpleDateFormat[] {new SimpleDateFormat("MM-dd-yyyy"), new SimpleDateFormat("yyyyMMdd"),
new SimpleDateFormat("MM/dd/yyyy")};
Date parsedDate = null;
for (int i = 0; i < formats.length; i++)
{
try
{
parsedDate = formats[i].parse(strDate);
return parsedDate;
}
catch (ParseException e)
{
continue;
}
}
}
throw new Exception("Unknown date format: '" + strDate + "'");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
90297 次 |
| 最近记录: |