在scala中解析日期错误

时间:2018-03-14 00:06:02

标签: scala date simpledateformat

我正在尝试解析scala中的日期,如下所示

scala> import java.text.SimpleDateFormat
import java.text.SimpleDateFormat

scala> import java.util.Calendar
import java.util.Calendar

scala> val simpleDateFormat = new SimpleDateFormat("YYYYMMDD")
simpleDateFormat: java.text.SimpleDateFormat = java.text.SimpleDateFormat@1e3cd860

scala> val date = simpleDateFormat.parse("20180312")
date: java.util.Date = Sun Dec 31 00:00:00 PST 2017

我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

您必须使用yyyyMMdd。请注意MM为大写。

Scala REPL

scala> val simpleDateFormat = new SimpleDateFormat("yyyyMMdd")
simpleDateFormat: java.text.SimpleDateFormat = java.text.SimpleDateFormat@ef87e460

scala> val date = simpleDateFormat.parse("20180312")
date: java.util.Date = Mon Mar 12 00:00:00 EET 2018

答案 1 :(得分:0)

我给你的Java代码信任你可以翻译成Scala:

    LocalDate date = LocalDate.parse("20180312", DateTimeFormatter.BASIC_ISO_DATE);
    System.out.println(date);

输出:

  

2018年3月12日

不需要那个臭名昭着的SimpleDateFormat课程及其过时的朋友CalendarDate。由于您需要的格式化程序是内置的,因此无需自己指定格式模式字符串。无法得到格式模式字母错误的情况。 java.time,现代Java日期和时间API为您提供了所有这些。我热烈推荐它。除此之外,LocalDate类java.time比DateCalendar更精确地匹配您的需求:LocalDate是没有时间的日期

您的代码出了什么问题?

格式模式字符串中的大写YYYY是基于周的年份,即周的周数所属的年份(因此实际上仅对周数有用)。 MM一个月没问题。大写DD用于一年中的一天中的数字(小写dd表示一个月中的某一天)。因此,您要求以2018年第1周,3月份和第12天开始的基于周的年份。这是自相矛盾的。 SimpleDateFormat的一个棘手特征是它应该抛出具有这种不可能要求的异常,而是假装一切都很好并且给你一些不正确的结果。让我猜,你的星期星期日开始?显然它放弃了月份和日期(因为它真的不知道日历年)并且只给了你第1周的第一天。在我的电脑上我得到了Mon Jan 01 00:00:00 CET 2018年,这可能是因为星期一是本周的第一天。

链接

Oracle tutorial: Date Time解释如何使用java.time