在Java中解析日期的通用方法

时间:2011-08-05 08:07:08

标签: java parsing date

在Java中解析日期的最佳方法是什么?是否有任何内置方法来解析字符串,如“2011年7月18日”,“2011年7月18日”,“18-07-2011”,“2011-07-18”,事先不知道格式?

7 个答案:

答案 0 :(得分:8)

标准API库中没有类似的东西。 Natty是一个试图这样做的图书馆,但你应该知道,这只能是“尽力而为”的事情,因为像2012年2月1日这样的事情只是含糊不清:没有关于格式的元信息,这是不可能的决定是2月1日还是1月2日。

答案 1 :(得分:2)

不是真的。 BalusC在DateUtil上写了一篇精彩的帖子,“解决”大多数日期格式解析。

答案 2 :(得分:2)

尝试使用默认格式DateFormat.MEDIUM和SHORT的DateFormat。

public static void main(String[] args) {
    // Make a String that has a date in it, with MEDIUM date format
    // and SHORT time format.
    String dateString = "Nov 4, 2003 8:14 PM";

    // Get the default MEDIUM/SHORT DateFormat
    DateFormat format =
        DateFormat.getDateTimeInstance(
        DateFormat.MEDIUM, DateFormat.SHORT);

    // Parse the date
    try {
        Date date = format.parse(dateString);
        System.out.println("Original string: " + dateString);
        System.out.println("Parsed date    : " +
             date.toString());
    }
    catch(ParseException pe) {
        System.out.println("ERROR: could not parse date in string \"" +
            dateString + "\"");
    }

http://javatechniques.com/blog/dateformat-and-simpledateformat-examples/

剪断

在例外情况下,您必须确定接下来要做什么,您可以构建解析Trys的层次结构。 像:

SimpleDateFormat df1 = new SimpleDateFormat( "dd/MM/yyyy" );
SimpleDateFormat df2 = new SimpleDateFormat( "dd-MM-yyyy" );

df1.parse(..)
df2.parse(..)

等等。

答案 3 :(得分:1)

如果您熟悉Simpledateformat,您只需在列表/数组中添加几个dateformatter,然后一个接一个地执行,直到达到有效日期为止。

这里的问题是:你如何处理日期,如

2011年6月7日

是7月6日还是6月7日?

但回答问题:不,没有“内置通用方式”

答案 4 :(得分:0)

你真的不能这样做。考虑“10-12-2011”。你的意思是12月10日或10月12日吗?您需要制作自己的模式列表才能尝试。此列表将根据区域设置以及该国家/地区的某个人将解释日期的“预期”方式而有所不同。

答案 5 :(得分:0)

您可以使用DateFormat.parse(...)并使用日期格式的区域设置,但仍然可能无法处理所有这些情况。这也不是那么容易:考虑以下两个可能的日期(相同):18/07/201107/18/2011 - 如何在不知道它是dd/mm/yyyy还是{{1}的情况下进行解析(例如在Saudi Arabia)?

答案 6 :(得分:0)

这是一个很大的问题,主要是因为日期是一个模糊的概念 - 例如2月或1月的02-01-2012?

你能做的最好的事情就是收集一堆不同的格式字符串并尝试每一个字符串直到你得到一个匹配...