其他答案是正确的,并且是 2013 年提出问题时的好答案。今天我们不应该再使用Date
nor SimpleDateFormat
,所以我想向您展示几个现代代码片段。格式化(在这种情况下)2 305 293 毫秒的正确方法取决于它们所代表的内容。我针对三种不同的情况提出了三种选择。
格式化自纪元以来的毫秒数
您需要决定要在哪个时区解释您的时间点。例如:
long millis = 2_305_293L;
DateTimeFormatter formatter = DateTimeFormatter
.ofLocalizedDateTime(FormatStyle.LONG)
.withLocale(Locale.ENGLISH);
ZonedDateTime dateTime = Instant.ofEpochMilli(millis)
.atZone(ZoneId.of("America/Coral_Harbour"));
String formattedTime = dateTime.format(formatter);
System.out.println(formattedTime);
美国东部时间 1969 年 12 月 31 日晚上 7:38:25
由于在时代珊瑚港处于 UTC 偏移量 -05:00,我们得到一个接近 1969 年底的时间。如果你想要 UTC 时间(因为时代是用 UTC 定义的;换句话说,如果你想要00:38:25
),有点不同:
DateTimeFormatter formatter = DateTimeFormatter
.ofLocalizedDateTime(FormatStyle.MEDIUM)
.withLocale(Locale.ENGLISH);
OffsetDateTime dateTime = Instant.ofEpochMilli(millis)
.atOffset(ZoneOffset.UTC);
1970 年 1 月 1 日,上午 12:38:25
除了时区之外,您还可以通过语言环境来改变语言,并通过格式样式(完整、长、中、短)来改变格式的长度。如果您想要没有日期的一天中的时间,请使用ofLocalizedTime
而不是ofLocalizedDateTime
.
格式化一天的毫秒
假设您的毫秒是从 0:00(“午夜”)开始在任何时区:
LocalTime time = LocalTime.MIN.with(ChronoField.MILLI_OF_DAY, millis);
System.out.println(time);
00:38:25.293
如果此格式令人满意,则不需要任何显式格式化程序。如果没有,您可以使用DateTimeFormatter
.
格式化持续时间,时间量
时间量与时间是完全不同的东西,它被当作一个Duration
对象来处理。没有直接支持格式化它,但从 Java 9 开始,它并不难(当你知道如何操作时):
Duration amountOfTime = Duration.ofMillis(millis);
String formattedTime = String.format("%02d:%02d:%02d",amountOfTime.toHours(),
amountOfTime.toMinutesPart(), amountOfTime.toSecondsPart());
System.out.println(formattedTime);
00:38:25
关联
Oracle 教程:日期时间解释如何使用 java.time。