如何在scala中将日期转换为yy-mm-dd

时间:2018-07-06 19:00:47

标签: scala datetime simpledateformat

我想在scala中将日期从dd-mm-yy转换为yy-mm-dd,但是我遇到了使它变为现实的问题

val format = new java.text.SimpleDateFormat("dd-mm-yyyy")
format.format(new java.util.Date())
output:
res0: String = 06-07-2018

但是如果我想将格式更改为yy-mm-dd:

val format = new java.text.SimpleDateFormat("yy-mm-dd")
format.format(new java.util.Date())
output:
res2: String = 18-41-06

我做错了什么?为什么毫米显示为41?

2 个答案:

答案 0 :(得分:2)

正确的格式是

val format = new java.text.SimpleDateFormat("yyyy-MM-dd")

答案 1 :(得分:1)

  

我做错了什么?

恕我直言,三件事:

  1. 您使用了早已过时的Date类和同样过时且臭名昭著的SimpleDateFormat类。而是使用java.time(现代的Java日期和时间API)。
  2. 您尝试使用自己的日期格式。在大多数情况下,您的用户会更喜欢Java的内置日期格式,并且可以为您节省容易出错的自己的格式模式字符串的书写。
  3. 正如其他人已经说过的那样,您在格式模式字符串中使用了小写的mm。这是每小时的分钟(格式模式字母区分大小写)。显然是由于巧合,您在一个小时后的7分钟运行了您的第一个摘要,因此它恰好与当月(7月)一致。

首先,请允许我证明java.time会更有用,如果您坚持编写自己的格式模式并且碰巧使用了错误的大小写(这对我们大多数人而言是不时发生的)。抱歉,我无法编写Scala,您将不得不使用Java。

    DateTimeFormatter dateFormatterWithWrongCase 
            = DateTimeFormatter.ofPattern("dd-mm-yyyy");
    LocalDate.now(ZoneId.of("America/Chicago")).format(dateFormatterWithWrongCase);

这将引发以下情况:

  

java.time.temporal.UnsupportedTemporalTypeException:不支持的字段:MinuteOfHour

它告诉我们,我们试图在几分钟之内完成某件事,这当然不是我们想要的。尽管乍一看可能无法使错误原因变得非常明显,但我还是比较喜欢此方法,而不是仅仅得到错误的结果。考虑到该消息,消息是相当精确的,因为LocalDate是没有一天的时间的日期,因此没有分钟的时间。

为了给用户一个不错的短日期格式,我建议:

    DateTimeFormatter dateFormatter = DateTimeFormatter
            .ofLocalizedDate(FormatStyle.SHORT)
            .withLocale(Locale.CANADA_FRENCH);
    System.out.println(LocalDate.now(ZoneId.of("America/Chicago")).format(dateFormatter));

今天印刷:

  

18-07-07

一个优点(我确实是说一个优点)是,在不同的语言环境中输出可能会有所不同。如果我使用Locale.US,则会得到(M / d / yy):

  

7/7/18

要使用JVM的默认语言环境,请指定Locale.getDefault()或直接忽略格式化程序上的withLocale调用。