我的日期格式为dd-mmm-yy或d-mmm-y格式,其中月份是字母缩写(例如,4月11日至09日或12月12日等等... ) 我想解析它以生成一个java.util.Date对象。
这可以通过利用java.text.DateFormat类来实现吗?或者还有另一种简单的方法吗?
答案 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)
这是现代答案。问题中提到的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
很酷吗?