从毫秒转换为日期字符串

Ale*_*wel 0 java datetime simpledateformat datetime-conversion

我尝试从毫秒转换为日期字符串。但是,结果并不像我预期的那样正确。

输入是毫秒(例如:1508206600485

我的时区是 UTC +10:00

------Expected-------------------------------------------- Actual------

01:32 (PM) 17/10/2017--------------------------------02:32 (PM) 17/10/2017
Run Code Online (Sandbox Code Playgroud)

这是方法

public static String getDate(long milliSeconds) {
    SimpleDateFormat formatter = new SimpleDateFormat("hh:mm dd/MM/yyyy");
    String dateString = formatter.format(new Date(milliSeconds));
    return dateString;
}
Run Code Online (Sandbox Code Playgroud)

小智 6

很好,您找到了解决方案,我只是想添加一种使用Java 8 新 java.time API 的方法。旧类(Date,CalendarSimpleDateFormat)有很多问题设计问题,如果可能,强烈建议切换到新 API。

如果您使用的是Java <= 7,则可以使用ThreeTen Backport,这是 Java 8 新日期/时间类的一个很好的向后移植。对于Android,您还需要ThreeTenABP(有关如何使用它的更多信息请点击此处)。

下面的代码适用于两者。唯一的区别是包名(在 Java 8 中是,java.time而在 ThreeTen Backport(或 Android 的 ThreeTenABP)中是org.threeten.bp),但类和方法是相同的。

要将毫秒值转换为特定时区,您可以使用Instant该类,然后使用 aZoneId转换为时区,创建一个ZonedDateTime. 然后使用 a 对其DateTimeFormatter进行格式化:

// convert millis value to a timezone
Instant instant = Instant.ofEpochMilli(1508206600485L);
ZonedDateTime z = instant.atZone(ZoneId.of("Australia/Sydney"));
// format it
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("hh:mm dd/MM/yyyy");
System.out.println(fmt.format(z)); // 01:16 17/10/2017
Run Code Online (Sandbox Code Playgroud)

输出是:

01:16 17/10/2017

请注意,我使用hh了小时。根据 javadoc,这个字母表示时钟-小时-上午-下午字段(值从 1 到 12),因此如果没有 AM/PM 指示符,它可能会不明确。也许您想添加 AM/PM 字段(将字母添加a到格式模式),或将小时更改为HH小时,一天中的值从 0 到 23)。

还要注意的是的实际值ZonedDateTime2017-10-17T13:16:40.485+11:00下午1时16分),因为在10月17日2017年,悉尼是夏令时,因此实际偏移+11:00