【问题标题】:parse date error in scala在scala中解析日期错误
【发布时间】:2018-03-14 00:06:02
【问题描述】:
我正在尝试解析 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
我在这里错过了什么?
【问题讨论】:
标签:
scala
date
simpledateformat
【解决方案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
【解决方案2】:
我给你的 Java 代码相信你可以翻译成 Scala:
LocalDate date = LocalDate.parse("20180312", DateTimeFormatter.BASIC_ISO_DATE);
System.out.println(date);
输出:
2018-03-12
不需要臭名昭著的麻烦 SimpleDateFormat 类及其早已过时的朋友 Calendar 和 Date。由于您需要的格式化程序是内置的,因此无需自己指定格式模式字符串。没有办法弄错格式模式字母的大小写。 java.time,现代 Java 日期和时间 API 为您提供了这一切。我热烈推荐它。最重要的是,java.time 的 LocalDate 类比 Date 或 Calendar 更精确地满足您的需求:LocalDate 是一个没有时间的日期。
你的代码出了什么问题?
格式模式字符串中的大写YYYY 表示基于周的年份,即周数所属的年份(因此仅对周数有用)。 MM 适合一个月。大写DD 表示一年中的第几天(小写dd 表示月份中的某天)。因此,您要求以 2018 年第 1 周、3 月和一年中的第 12 天开始的基于周的年份。这是自相矛盾的。 SimpleDateFormat 的麻烦特性之一是它应该抛出具有如此不可能的要求的异常,而不是假装一切都很好并给你一些不正确的结果。让我猜猜,你的一周从星期日开始?所以显然它放弃了一年中的月份和日期(因为它并不真正知道日历年),只是给了你第一周的第一天。在我的电脑上,我得到了 Mon Jan 01 00:00:00 CET 2018,这可能是因为星期一是这里一周的第一天。
链接
Oracle tutorial: Date Time 解释如何使用java.time。