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

how to convert date to yy-mm-dd in scala

我想在 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

我做错了什么?为什么 mm 显示为 41?

正确的格式是

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

what did I do wrong?

恕我直言三件事:

  1. 您使用了早已过时的 Date class 和同样过时且臭名昭著的麻烦 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: Unsupported field: 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 调用。