如何在不知道格式的情况下将字符串转换为日期?

新手上路,请多包涵

我有个问题。我正在尝试将一些字符串转换为日期,但我不知道日期到达的格式。

它可能以 yyyy.mm.dd hh:mm:ssMM.dd.yy hh:mm:ss 等形式出现。

如何将这些字符串转换为日期?我试过这个:

 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 hh:mm:ss ,但是当我运行上面的代码时,日期对象现在变成了 Sat Jan 31 00:42:48 CET 11 这至少可以说是奇怪的。

有什么想法可以正确格式化字符串吗?

原文由 Shervin Asgari 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 361
2 个回答

你不能!

如果您有日期 2010-08-05 那么它可以是 2010 年 8 月 5 日或 2010 年 5 月 8 日 - 您 需要 知道日期格式(或至少优先考虑一种格式)以区分它们。

原文由 Justin 发布,翻译遵循 CC BY-SA 2.5 许可协议

我同意 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;
    }
}

原文由 Eyal Schneider 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题