如何在 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?
恕我直言三件事:
- 您使用了早已过时的
Date
class 和同样过时且臭名昭著的麻烦 SimpleDateFormat
。而是使用 java.time
,现代 Java 日期和时间 API.
- 您尝试推出自己的日期格式。在大多数情况下,您的用户会更喜欢 Java 的内置日期格式,并且它们可以避免您编写自己的格式模式字符串时容易出错的情况。
- 正如其他人已经说过的,您在格式模式字符串中使用了小写
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
调用。
我想在 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?
恕我直言三件事:
- 您使用了早已过时的
Date
class 和同样过时且臭名昭著的麻烦SimpleDateFormat
。而是使用java.time
,现代 Java 日期和时间 API. - 您尝试推出自己的日期格式。在大多数情况下,您的用户会更喜欢 Java 的内置日期格式,并且它们可以避免您编写自己的格式模式字符串时容易出错的情况。
- 正如其他人已经说过的,您在格式模式字符串中使用了小写
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
调用。