你不能那样做。有几个原因。
TL;DR:不要使用Date,使用Instant。这些都不能有格式。格式化成字符串取决于时区,所以需要选择时区。
首先,我从讨论中了解到,您要求使用格式为 yyyy-MM-dd HH:mm:ss 的 java.util.Date 对象。 Date 对象中没有也不能有格式。您应该在这里尝试理解的是数据本身与向用户呈现数据之间的区别。 int 可能保存值 25389,但它不保存格式 25389(实际上内部表示与 25389 完全不同)。相同的int 可以作为 25389、000025389、25,389 或 +25389 呈现给用户,这只是众多可能性中的一小部分。格式化发生在int 之外,而int 保持不变。
同样,Date 对象包含一个时间点。相同的日期可以格式化为例如 2017-04-12 23:14:52 或 April 12, 2017 11:14:52 PM。它甚至可以针对不同的时区进行格式化,如果系统有不同时区的用户,这将是一个好主意。或者,我们可以向用户显示日历叶和/或显示时间的时钟。同样,格式化发生在 Date 之外,而 Date 保持不变。
详细说明时区问题,由相同毫秒值表示的相同时间点可以格式化为 UTC 中的 2017-04-12 17:44:52,我的 2017-04-12 19:44:52时区,亚洲/加尔各答时区的 2017-04-12 23:14:52 甚至太平洋/奥克兰时区的 2017-04-13 05:44:52。请注意,在最后一种情况下,甚至日期都不相同。因此,将毫秒更改为您要求的格式的方法不止一种。我们需要知道您想要哪个时区才能为您提供帮助。
所以我相信你需要的不是一件事,而是两件事
- 一种在程序中存储时间点的方法。
- 一种为某个时区的用户将时间点格式化为 yyyy-MM-dd HH:mm:ss 格式的字符串的方法。
要存储您的时间点,请使用任一
-
long 表示您已有的毫秒值
-
java.time.Instant 对象。
为什么我没有提到java.util.Date?因为这个类已经过时了。它的设计很快就变得很麻烦。他们试图通过弃用大多数方法并引入java.util.Calendar 来修复它,但这也效果不佳。最后,他们借鉴了一个名为 Joda-Time 的库的经验,于 2014 年在 Java 8 中引入了java.time 类。那是三年前的事了。所以恕我直言,我们现在应该把Date 和朋友扔到一边,开始使用更新的类。所以更喜欢Instant 而不是Date。
将毫秒更改为 Instant 很简单:
long milliseconds = 1492019092000L;
Instant pointInTime = Instant.ofEpochMilli(milliseconds);
正如我所说,为了将您的即时格式化为用户的字符串,我们需要一个时区。然后做
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
String formattedDateTimeString = pointInTime.atZone(ZoneId.of("Asia/Kolkata"))
.format(formatter);
所以您需要填写我输入ZoneId.of("Asia/Kolkata") 的所需时区。如果要使用JVM当前的时区设置,只需填写ZoneId.systemDefault()即可。但请注意,时区设置可能会被更改,即使是在同一 JVM 中运行的不相关程序也是如此,因此依赖它可能会很脆弱。
上面代码sn-p的结果是一个类似的字符串
2017-04-12 23:14:52
PS 如果看完上面的内容你真的坚持,下面是如何从上面得到java.util.Date:
Date myOutdatedDateInstance = Date.from(pointInTime);
(请原谅我重复一遍,它仍然没有所需的格式,这是不可能的)。