我尝试将毫秒转换为日期字符串。但是,结果并不像我预期的那样正确。
输入为毫秒(例如:1508206600485
)
我的时区为UTC +10:00
------Expected-------------------------------------------- Actual------
01:32 (PM) 17/10/2017--------------------------------02:32 (PM) 17/10/2017
这是
的方法public static String getDate(long milliSeconds) {
SimpleDateFormat formatter = new SimpleDateFormat("hh:mm dd/MM/yyyy");
String dateString = formatter.format(new Date(milliSeconds));
return dateString;
}
答案 0 :(得分:4)
好you found a solution,我只想添加 Java 8 new java.time API的方法。旧类(Date
,Calendar
和SimpleDateFormat
)有lots of problems和design issues,强烈建议您切换到新的API可能的。
如果您正在使用 Java< = 7 ,则可以使用ThreeTen Backport,这是Java 8新日期/时间类的绝佳后端。对于 Android ,您还需要ThreeTenABP(更多关于如何使用它here)。
以下代码适用于两者。
唯一的区别是包名称(在Java 8中为java.time
而在ThreeTen Backport(或Android的ThreeTenABP中)为org.threeten.bp
),但类和方法名称是一样的。
要将millis值转换为特定时区,您可以使用Instant
类,然后使用ZoneId
转换为时区,创建ZonedDateTime
。
然后使用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
输出结果为:
01:16 17/10/2017
请注意,我在小时内使用hh
。 According to javadoc,此lettern代表 clock-hour-am-pm 字段(值从1到12),因此如果没有AM / PM指示符,则可能不明确。您可能希望添加上午/下午字段(将字母a
添加到格式模式中),或将小时数更改为HH
(一天中的小时,并带有值从0到23)。
另请注意,ZonedDateTime
的实际值为2017-10-17T13:16:40.485+11:00
( 01:16 PM ),因为在2017年10月17日 th , Sydney is in Daylight Saving Time,因此实际偏移量为+11:00
。
答案 1 :(得分:0)
基于@phlaxyr,我解决了我的问题。您可以通过以下链接获取您的时区
http://tutorials.jenkov.com/java-date-time/java-util-timezone.html
public static String getDate(long milliSeconds) {
SimpleDateFormat formatter = new SimpleDateFormat("hh:mm dd/MM/yyyy");
formatter.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"));
String dateString = formatter.format(new Date(milliSeconds));
return dateString;
}