【问题标题】:Convert from Millisecond to String of Date从毫秒转换为日期字符串
【发布时间】:2017-10-17 02:24:08
【问题描述】:

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

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

【问题讨论】:

  • 输入是什么,代码运行在哪个时区?
  • 输入是毫秒
  • 是的,但实际数字是多少?你的时区是什么时候?或者更重要的是,您计算机上的区域设置是什么时区?
  • 我不知道有一个时区,所以我怎么知道我的时区是什么
  • 真的11:16 17/10/2017

标签: java datetime simpledateformat datetime-conversion


【解决方案1】:

好的you found a solution,我只是想用 Java 8 new java.time API 添加一个方法。旧类(DateCalendarSimpleDateFormat)有 lots of problemsdesign issues,如果可能,强烈建议切换到新 API。

如果您使用的是 Java ,则可以使用 ThreeTen Backport,这是 Java 8 新日期/时间类的一个很好的向后移植。对于Android,您还需要ThreeTenABP(更多关于如何使用它here)。

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

要将毫秒值转换为特定时区,您可以使用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,这个字母代表 clock-hour-of-am-pm 字段(值从 1 到 12),因此如果没有 AM/PM 指示符,它可能会产生歧义。也许您想添加 AM/PM 字段(将字母 a 添加到格式模式),或者将小时更改为 HH小时时间,值从 0 到 23 )。

还要注意ZonedDateTime 的实际值是2017-10-17T13:16:40.485+11:0001:16 PM),因为在 2017 年 10 月 17 日thSydney is in Daylight Saving Time,所以实际的偏移量是+11:00

【讨论】:

  • 这是解决这个问题的正确方法。我仍然想知道(1)为什么 OP 的预期输出是下午 1:32,(2)为什么 OP 的时区一开始就不正确。您的解决方案没有解决这些问题;但我在这里投了赞成票,因为这是向将来偶然发现这个问题的任何人展示的最好的东西。
  • @DawoodibnKareem 第 1 项,我想这可能是一个错字或 OP 实际使用另一个输入值进行了测试。第 2 项,我根据 OP 自己的回答说悉尼时区解决了这个问题 - 可能没有考虑 DST,因为悉尼实际上在不在 DST 时使用 +10:00 偏移量。或者他们的 JVM 默认时区可能设置为不同的时区,谁知道...
  • 是的,可能。我正在考虑投票以“无法重现”来结束这个问题,这当然也包括错字案例。但是,您现在在这里的回答值得保留这个问题。
【解决方案2】:

基于@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;
}

【讨论】:

    猜你喜欢
    • 2012-07-29
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2012-09-12
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多