【问题标题】: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 类及其早已过时的朋友 CalendarDate。由于您需要的格式化程序是内置的,因此无需自己指定格式模式字符串。没有办法弄错格式模式字母的大小写。 java.time,现代 Java 日期和时间 API 为您提供了这一切。我热烈推荐它。最重要的是,java.time 的 LocalDate 类比 DateCalendar 更精确地满足您的需求:LocalDate 是一个没有时间的日期。

    你的代码出了什么问题?

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

    链接

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

    【讨论】:

      猜你喜欢
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-12
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多