Java DateFormat解析为当前年/月/日期(如果未指定为模式的一部分)

Java DateFormat解析为当前年/月/日期(如果未指定为模式的一部分),java,date,simpledateformat,date-format,Java,Date,Simpledateformat,Date Format,可能我正在尝试实现一些从SimpleDateFormat开箱即用的功能,如果模式中未定义yy/mm/dd,则限制年/月/日期默认为1970/Jan/01 例如: String pattern = "hh:mm:ss"; SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern); Date date = simpleDateFormat.parse("08:05:05"); System.out.println(date);

可能我正在尝试实现一些从
SimpleDateFormat
开箱即用的功能,如果模式中未定义yy/mm/dd,则限制年/月/日期默认为1970/Jan/01

例如:

String pattern = "hh:mm:ss";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
Date date = simpleDateFormat.parse("08:05:05");
System.out.println(date);
结果是:1970年1月1日星期四08:05:05

我有一个场景,在这个场景中,我可以接收到API中的任何自定义模式,如果模式中缺少相应的格式符号(缺少y、m或d),我应该能够解析到当前日期/月/日

上述示例的预期结果(今天是2018年6月4日):2018年6月4日星期一08:05:05 IST

有谁能帮助我实现这种行为吗?

java.time 如果模式说应该,上面的方法基本上将使用字符串中的日、月和/或年,如果不应该,则使用今天日期中的相应值。例如:

    parseCustomFormat("HH:mm:ss", "08:05:05");
    parseCustomFormat("yyyy-MM-dd'T'HH:mm:ss", "2015-11-23T21:41:45");
    parseCustomFormat("MM H:mm", "10 20:58");
    parseCustomFormat("yy d H:mm", "34 29 9:30");
当我今天运行这段代码时,输出是:

08:05:05            -> 2018-06-04T08:05:05
2015-11-23T21:41:45 -> 2015-11-23T21:41:45
10 20:58            -> 2018-10-04T20:58
34 29 9:30          -> 2034-06-29T09:30
如果模式包含一周、一年和/或周数,
u
表示一年或一周中的一天,解析将很容易失败。如果它包含AM或PM内的小时(小写
h
,如问题中的示例所示),并且没有AM/PM标记,则肯定会失败

我们有一个必须从Java1.6支持的遗留代码+

没什么大问题。我已经在Java7上运行了上述代码,其中有三个后端口,
Java.time
到Java6和Java7的后端口(参见底部的链接),因此它也应该在Java6上运行。如果您的旧代码需要
java.util.Date
(并且不想现在升级到
java.time
),请按如下方式转换:

    Instant inst = parsedDateTime.atZone(ZoneId.systemDefault()).toInstant();
    Date oldfashionedDate = DateTimeUtils.toDate(inst);
    System.out.format(Locale.ENGLISH, "%-19s -> %s%n",  dateTimeString, oldfashionedDate);
通过对上述代码的更改,我的计算机上的输出为:

08:05:05            -> Mon Jun 04 08:05:05 CEST 2018
2015-11-23T21:41:45 -> Mon Nov 23 21:41:45 CET 2015
10 20:58            -> Thu Oct 04 20:58:00 CEST 2018
34 29 9:30          -> Thu Jun 29 09:30:00 CEST 2034
链接
  • 解释如何使用
    java.time
  • ,其中首先描述了
    java.time
  • ,java.time的后端口到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

我建议您避免使用
SimpleDateFormat
类。它不仅早已过时,而且还出了名的麻烦。今天我们的生活好多了。有了它,您的问题就有了不止一个简单的解决方案。@T.J.Crowder感谢您的格式帮助。下次我会记得的。我们有一个必须从Java1.6+支持的遗留代码,实际上无法切换到最新的代码。对于Java1.6+我建议使用
Java.time
through,从后端口到Java6和Java7。backport的
DateTimeUtils
类包含转换方法,允许您与遗留代码进行互操作,例如向其传递老式的
Date
对象。所以,是的,你们都可以切换到新代码,并从中受益。
3/3/3
是什么意思?试图解决这个问题有一个内在的危险,有很多边缘案例需要处理。非常感谢@ole v.v。似乎没有你提到的直接方法,我们需要按照你的建议做一些事情。实际上,我正在尝试解决一个JSpinner(DateSpinner)问题,如中所述。我的想法是提供一个定制的dateFormatter,它可以进行上述转换。从我的分析中,我发现DateSpinner UI上的文本字段由dateFormatter支持,因此每当我们旋转spinner时,新文本都会被底层格式化程序解析为Date(),并存储在模型中。我想如果我能改变格式化程序的行为,它会解决这个问题。
08:05:05            -> Mon Jun 04 08:05:05 CEST 2018
2015-11-23T21:41:45 -> Mon Nov 23 21:41:45 CET 2015
10 20:58            -> Thu Oct 04 20:58:00 CEST 2018
34 29 9:30          -> Thu Jun 29 09:30:00 CEST 2034