如何在不知道格式的情况下将String转换为Date?

She*_*ari 42 java format date

我有个问题.我试图将一些字符串转换为日期,我不知道日期到达的格式.

它可能会yyyy.mm.dd hh:mm:ssMM.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日 - 您需要知道日期格式(或者至少优先考虑一种格式),以区分它们.

  • @Pawel:"从技术上讲,我可以使用整数值来表示Pi,它只是不正确." (32认同)
  • 嗯,技术上他可以,但他不知道这是否正确. (5认同)
  • @JoachimSauer:从技术上讲,你不能用任意数字的数字来表示Pi;) (4认同)
  • @mahieddine实际上这是一个答案.它说你做不到! (3认同)

Eya*_*der 11

我同意Kragen的说法,一般情况下没有正确的解决方案.但是,如果满足以下条件,您可以使用以下解决方案:

  1. 您有一套所有可能的格式

  2. 格式之间没有歧义; 其中两个不能成功解析日期表达式.

考虑以下解决方案,它迭代可能的格式列表.此解决方案利用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)


oks*_*ayt 7

如前所述,您至少需要一个有序的模式候选列表.有了这个,Apache DateUtils有一个parseDate(String dateString, String[] patterns)方法可以让你轻松地在日期字符串上试用一个模式列表,并通过匹配的第一个模式解析它:

public static Date parseDate(String str,
                         String[] parsePatterns)
                  throws ParseException
Run Code Online (Sandbox Code Playgroud)

通过尝试各种不同的解析器来解析表示日期的字符串.

解析将依次尝试每个解析模式.如果解析整个输入字符串,则认为解析成功.如果没有解析模式匹配,则抛出ParseException.

解析器将对解析日期宽容.


bjo*_*ern 7

这是一个基于美国日期格式的快速而肮脏的解决方案.

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)