我试图用波兰语言环境中的d mmmm yyyy格式解析日期(2020年12月3日),但无法解析。但是为什么同样的解析在任何其他语言环境(如英语等)中都能正常工作呢?下面的代码示例不起作用。有人能帮忙吗?
Locale loc = new Locale("pl", "PL");
String date = "3 December 2020";
SimpleDateFormat sdFormat =
new SimpleDateFormat("d MMMM yyyy", loc);
sdFormat.setLenient(false);
try {
Date d = sdFormat.parse(date);
System.out.println(d);
} catch (ParseException e) {
e.printStackTrace();
}
2条答案
按热度按时间vm0i2vca1#
你好像把解析和格式化搞混了。
因为你的输入日期字符串
English
,您需要使用Locale.ENGLISH
你需要另一个SimpleDateFormat
与Locale("pl", "PL")
格式化获取的java.util.Date
对象new Locale("pl", "PL")
.演示:
输出:
我相信您已经知道日期时间对象只存储日期时间信息*1而不存储格式信息。打印时,日期时间对象打印
toString
类的实现。还有,一个java.util.Date
对象不表示真正的日期时间类,因为它只存储毫秒(例如。new Date()
对象示例化的毫秒数January 1, 1970, 00:00:00 GMT
)当您打印它时,它会计算jvm时区中的日期时间,并打印相同的日期时间,也就是说,如果您在世界上任何地方的给定时刻执行以下两行,你会得到相同的号码。请检查此答案以获取演示。
api的日期时间
java.util
以及它们的格式化api,SimpleDateFormat
它们已经过时了,而且由于有这么多这样的黑客,它们很容易出错。建议完全停止使用它们,并切换到现代日期时间api。在trail:date-time了解有关现代日期时间api的更多信息。注意:如果您正在为一个android项目工作,并且您的android api级别仍然不符合java-8,请检查通过desugaring提供的java8+api以及如何在android项目中使用threetenabp。
使用现代日期时间api:
输出:
uqdfh47h2#
当试图确定解析的问题时,总是做相反的操作,即生成输出,以查看解析的输入应该是什么样子。这是一种非常适用于所有解析相关问题的技术,无论是解析日期字符串、xml文档、json文本等。
因此,我们尝试使用给定格式打印日期值,以查看解析时的预期结果:
在Java7中,我得到
3 grudzień 2020
.在Java8、9、11和14中,我得到
3 grudnia 2020
.如果你想解析
3 December 2020
,然后使用例如。Locale.ENGLISH
.