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