解析scala中的日期错误

parse date error in scala

我正在尝试像下面这样在 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

我在这里错过了什么?

您必须使用 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

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

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

输出:

2018-03-12

不需要臭名昭著的麻烦 SimpleDateFormat class 及其早已过时的朋友 CalendarDate。无需自己指定格式模式字符串,因为您需要的格式化程序是 built-in。无法弄错格式模式字母的大小写。 java.time,现代 Java 日期和时间 API 为您提供这一切。我热烈推荐它。除此之外,java.time 的 LocalDate class 比 DateCalendar 更符合您的需求:LocalDate 是一个日期没有 time-of-day.

你的代码出了什么问题?

格式模式字符串中的大写 YYYY 表示 week-based 年,即周数所属的年份(因此仅对周数有用)。 MM 一个月没问题。大写 DD 表示一年中的第几天(小写 dd 表示一个月中的第几天)。因此,您询问了从 2018 年第 1 周、3 月和该年的第 12 天开始的 week-based 年。这是self-contradictory。 SimpleDateFormat 的一个麻烦特征是它应该抛出一个具有如此不可能的要求的异常,而不是假装一切都很好并给你一些不正确的结果。让我猜猜,你的一周从星期日开始?所以显然它放弃了月份和 day-of-year(因为它并不知道日历年)并且只给了你第 1 周的第一天。在我的电脑上我得到了 Mon Jan 01 00:00:00 CET 2018年,这可能是因为星期一是这里一周的第一天。

Link

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