如何将string转换为date而不知道格式?
我有个问题。 我正在尝试将一些string转换为date,而我不知道date到达的格式。
它可能是yyyy.mm.dd hh:mm:ss
或MM.dd.yy hh:mm:ss
等等。
如何将这些string转换为Date? 我试过这个:
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss"); Date d = (Date)formatter.parse(someDate);
但是,当我打印出someDate它打印出这样的:2010-08-05 12:42:48.638 CEST这意味着yyyy.mm.dd yyyy.mm.dd hh:mm:ss
,但是当我运行上面的代码时,date对象现在变成了Sat Jan 31 00:42:48 CET 11
这是很奇怪的,至less可以说。
任何想法如何正确地格式化stringdate?
你不能!
如果你的date是2010年8月5日,那么它可以是2010年8月5日,也可以是2010年5月8日 – 你需要知道date格式(或者至less优先考虑一种格式)来区分它们。
我同意Kragen在一般情况下没有正确的解决办法。 但是,如果以下条件成立,您可以使用下面的解决scheme:
-
你有一套所有可能的格式
-
格式之间没有歧义。 没有dateexpression式可以成功parsing他们两个。
考虑下面的解决scheme,它遍历可能的格式列表。 此解决scheme使用ThreadLocal
,以便在multithreading环境中进行dateparsing(请记住, 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; } }
如前所述,您至less需要有一个模式候选人的有序列表。 一旦你有了, Apache的DateUtils有一个parseDate(String dateString, String[] patterns)
方法,可以让你轻松地在你的datestring上尝试一系列模式,并parsing它匹配的第一个:
public static Date parseDate(String str, String[] parsePatterns) throws ParseException
通过尝试各种不同的parsing器来parsing表示date的string。
parsing将依次尝试每个parsing模式。 parsing只有在parsing整个inputstring时才被认为是成功的。 如果没有parsing模式匹配,则抛出ParseException。
parsing器将对parsingdate宽松。
您的问题与国际化有关。 Kragen回答说,你不能以未知格式parsingdate。 虽然您可以扫描所有可能的语言环境并parsing某些内容 ,但是您不知道它是否正确parsing。
只是一个小小的国际背景:
问:你能告诉我这个date的月份和年份是指什么:
09/11/10?
答:不知道区域设置,你不能。 这可能是任何事情。 9月11日在美国。 11月9日在英国。 等等。
这是一个基于美国date格式的快速和肮脏的解决scheme。
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 + "'"); }
如果它的协议; 定义格式 – 也许ISO会刺激除瑞典以外的所有人…
如果从用户input; 让他们设置他们的语言环境。 如果你可以做到这一点,以全格式显示parsingdate,以便用户可以validation它,如2009年11月10日。
我唯一的猜测是,你应该先收集一些统计数据来确定格式。
如果你幸运的话,你会有像“2010/08/13”这样的date,可以毫不含糊地parsing
这是简单的解决scheme,这是为我工作。 这是parsingdate的简单方法,将String作为parameter passing并以任何您想要的格式parsing它。
String dateToConvert(String date) { String strDate = ""; try { //create SimpleDateFormat object with source string date format DateFormat sdfSource = new SimpleDateFormat("yyyy-MM-dd"); //parse the string into Date object Date d = sdfSource.parse(date); LocalLog.e(LOG_TAG, d.toString()); //create SimpleDateFormat object with desired date format SimpleDateFormat sdfDestination = new SimpleDateFormat(AppConstants.UNIVERSAL_DATE_FORMAT); //parse the date into another format strDate = sdfDestination.format(d); LocalLog.e(LOG_TAG, strDate); } catch (ParseException pe) { System.out.println("Parse Exception : " + pe); } return strDate; }
public String compareDate( PaymentTxnRequest request ) throws ParseException { Date debitDate= request.getPaymentTxn().getCrValDt(); Date now = new Date(); String response=""; SimpleDateFormat sdfDate = new SimpleDateFormat("dd/MM/yyyy"); String strCurrDate = sdfDate.format(now); String strDebitDate = sdfDate.format(debitDate); System.out.println("Current Date: " + strCurrDate); Date currentDate = new SimpleDateFormat("dd/MM/yyyy").parse(strCurrDate); Date txnDate = new SimpleDateFormat("dd/MM/yyyy").parse(strDebitDate); System.out.println("C -> "+currentDate); System.out.println("C -> "+txnDate); if (txnDate!=null){ if (currentDate.equals(txnDate)) { System.out.println("Valid Txn"); response="valid"; } if (currentDate.after(txnDate)) { System.out.println("--> Not Valid TXN Past"); response="notValid"; } if (currentDateenter code here.before(txnDate)){ System.out.println("Future Valid TXn"); response="future"; } } return response; }