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
,Calendar
和SimpleDateFormat
)有很多问题和设计问题,如果可能,强烈建议切换到新 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)。
还要注意的是的实际值ZonedDateTime
是2017-10-17T13:16:40.485+11:00
(下午1时16分),因为在10月17日日2017年,悉尼是夏令时,因此实际偏移+11:00
。
归档时间: |
|
查看次数: |
3160 次 |
最近记录: |