从毫秒转换为日期字符串

时间:2017-10-17 02:24:09

标签: java datetime simpledateformat datetime-conversion

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

输入为毫秒(例如: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;
}

2 个答案:

答案 0 :(得分:4)

you found a solution,我只想添加 Java 8 new java.time API的方法。旧类(DateCalendarSimpleDateFormat)有lots of problemsdesign 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

请注意,我在小时内使用hhAccording 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;
}