用Java解析约会?

时间:2009-11-12 21:34:00

标签: java parsing date

我的日期格式为dd-mmm-yy或d-mmm-y格式,其中月份是字母缩写(例如,4月11日至09日或12月12日等等... ) 我想解析它以生成一个java.util.Date对象。

这可以通过利用java.text.DateFormat类来实现吗?或者还有另一种简单的方法吗?

7 个答案:

答案 0 :(得分:4)

您可能需要使用SimpleDateFormat来解析自定义格式。这个article解释了格式化的细节。

"d-MMM-yyyy" corresponds to 4-Nov-2009

答案 1 :(得分:2)

SimpleDateFormat是通常用于此的类。请注意,此类线程安全(有点违反直觉),如果您在线程上下文中使用它,那么调查Joda及其DateTimeFormatter是值得的

答案 2 :(得分:1)

您可以使用java.text.SimpleDateFormat执行此操作。点击链接,您将看到所有模式。

对于1-2位数天,您可以使用d模式。对于3个字符的月份缩写,您可以使用MMM模式。对于2位数年份,您可以使用yy模式。

所以应该做以下事情:

String dateString = "4-Nov-09";
SimpleDateFormat sdf = new SimpleDateFormat("d-MMM-yy");
Date date = sdf.parse(dateString);

答案 3 :(得分:1)

无论您做什么,请使用区域设置。这样,当输入带有法语月份名称时,您仍然会得到合理的结果。

答案 4 :(得分:1)

java.time

这是现代答案。问题中提到的DateFormat类及其在大多数旧答案中使用的SimpleDateFormat子类非常麻烦,而且已经过时了。请勿使用其中任何一个。也不要使用Date,因为它的设计不当,而且已经过时了。

由于您的年份是两位数(示例中为09和05),因此您需要确定一个世纪。在第一轮中,我假设年份在2000年到2099年之间。

首先,我们需要一个格式化程序:

static DateTimeFormatter dateFormatter
        = DateTimeFormatter.ofPattern("d-MMM-uu", Locale.ENGLISH);

DateTimeFormatter是线程安全的,因此我们很高兴一个实例可供所有人使用。 @shoover是正确的,我们应该提供语言环境。像这样使用格式化程序:

    String text = "4-Nov-09";
    LocalDate date = LocalDate.parse(text, dateFormatter);
    System.out.println("Date: " + date);

输出为:

  

日期:2009-11-04

验证

对于验证,尤其是对两位数年份的正确解释,我建议您添加范围检查。例如,要验证解析的日期距过去或将来不超过10年:

    LocalDate today = LocalDate.now(ZoneId.systemDefault());
    if (date.isBefore(today.minusYears(10))
            || date.isAfter(today.plusYears(10))) {
        System.err.println("This date can’t be right");
    }

出于许多目的,您会提前知道日期是过去或将来的日期,并且可以比我的示例更有效地缩小有效间隔。

其他世纪

如果年份可以超出20xx范围,我们将通过DateTimeFormatterBuilder及其appendValueReduced方法控制年份的解释。请参阅下面的链接列表中的相关答案之一。

链接

答案 5 :(得分:0)

答案 6 :(得分:0)

您可以尝试使用此库dateparser

它可以自动识别任何字符串,并将其解析为日期日历 LocalDateTime OffsetDateTime 。

有了它,您不必准备任何适当的模式:

Date date = DateParserUtils.parseDate("12-Dec-05");

date将是Mon Dec 12 00:00:00 CST 2005

很酷吗?