【问题标题】:convert epoch time to date将纪元时间转换为日期
【发布时间】:2011-12-06 03:49:25
【问题描述】:

我已经尝试了上百万种不同的方法来做到这一点,但都无济于事。任何帮助将非常感激。

long millis = getMillisFromServer();
Date date = new Date(millis);
DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
format.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"));
String formatted = format.format(date);

上面的不行。

基本上,我想做的是,获取纪元时间并将其转换为澳大利亚时间。我的当地时间是 +05.30,但我当然不希望这成为促成这种转换的因素。

编辑-

当我运行你的确切代码时输出,

纪元 1318388699000

2011 年 10 月 12 日星期三 08:34:59 GMT+05:30

2011 年 12 月 10 日 03:04:59

12/10/2011 14:04:59

【问题讨论】:

  • 这段代码没问题。我不明白你想要实现什么,以及为什么这段代码不适合你。你能举一个输入和输出代码的例子吗?
  • 也许 OP 担心的问题是“Australia/Sydney”的偏移量不是 05:30,而是 +10。见ideone.com/qydGJ
  • @Hades:您能说一下您的代码在什么情况下方式不起作用?你看到了什么,你期待什么?该代码对我有用...

标签: java datetime timezone datetime-format


【解决方案1】:

编辑:好的,所以您不希望您的 本地 时间(不是澳大利亚)对结果做出贡献,而是澳大利亚时区。你现有的代码应该是绝对没问题的,虽然Sydney is currently UTC+11,不是UTC+10 ..简短但完整的测试应用程序:

import java.util.*;
import java.text.*;

public class Test {
    public static void main(String[] args) throws InterruptedException {
        Date date = new Date(1318386508000L);
        DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        format.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
        String formatted = format.format(date);
        System.out.println(formatted);
        format.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"));
        formatted = format.format(date);
        System.out.println(formatted);
    }
}

输出:

12/10/2011 02:28:28
12/10/2011 13:28:28

我还建议您开始使用 Joda Time,它只是一个更好的日期/时间 API...

编辑:请注意,如果您的系统不知道 Australia/Sydney 时区,它会显示 UTC。例如,如果我更改要使用 TimeZone.getTimeZone("blah/blah") 的代码,它将显示两次 UTC 值。我建议您打印 TimeZone.getTimeZone("Australia/Sydney").getDisplayName() 并查看它的内容...并检查您的代码是否有错别字:)

【讨论】:

  • 1318386508000
  • @Hades:悉尼时间目前是UTC+11,不是UTC+10。因此,如果唯一的问题是您看到的时间与您的预期不同,那可能只是您的预期......
  • 问题是当我转换它时..系统打印+0 GMT时间而不是澳大利亚时间。纪元 1318388699000 10 月 12 日星期三 08:34:59 GMT+05:30 2011 12/10/2011 03:04:59 12/10/2011 14:04:59 这是我运行代码时的输出 纪元 1318388699000 08 年 10 月 12 日星期三:34:59 GMT+05:30 2011 12/10/2011 03:04:59 12/10/2011 14:04:59
  • @Hades:如果您在我的回答中运行确切的简短但完整的程序会发生什么? “系统打印+0 GMT时间”是什么意思?您的系统是否可能不知道澳大利亚/悉尼时区?
  • 我正在运行 android,我认为它确实知道。编辑了我的答案
【解决方案2】:

这是现代答案(自 2014 年起生效)。接受的答案是 2011 年的一个非常好的答案。这些天我建议不要使用 Date、DateFormat 和 SimpleDateFormat 类。使用现代 Java 日期和时间 API,这一切都变得更加自然。

要从您的 Millis 中获取日期时间对象:

    ZonedDateTime dateTime = Instant.ofEpochMilli(millis)
            .atZone(ZoneId.of("Australia/Sydney"));

如果millis 等于1318388699000L,则为您提供2011-10-12T14:04:59+11:00[Australia/Sydney]。如果代码以某种奇怪的方式出现在不知道澳大利亚/悉尼时区的 JVM 上,一定会通过异常通知您。

如果您希望以字符串格式显示日期时间:

String formatted = dateTime.format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss"));

结果:

12/10/2011 14:04:59

PS 我不知道您所说的“上述内容不起作用”是什么意思。在我的电脑上,你在问题中的代码也会打印出12/10/2011 14:04:59。

【讨论】:

  • 我认为问题在于运行android的手机在转换时处于不同的时区;我认为在计算机上运行它并不重要。我后来才知道。感谢您提供更新的答案。
  • 为一个人的时间操作提供明确的时区总是一个好主意。感谢您报告您的旧问题。 @Hades
【解决方案3】:

请注意纪元时间以秒为单位,并且 Date 对象接受以毫秒为单位的 Long 值。 因此,您必须将 epoch value 乘以 1000 才能将其用作 long value 。 如下所示:-

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
sdf.setTimeZone(TimeZone.getTimeZone(timeZone));
Long dateLong=Long.parseLong(sdf.format(epoch*1000));

【讨论】:

  • 为此,epoch 必须是 long。这是一个int,你的乘法会溢出,你会得到一个不正确的结果。另外我不认为 OP 要求 Long 结果,但也许其他人可以使用它。
  • 作为 Ole V.V.表示您需要将 long 值相乘。您可以将1000 更改为1_000L,并在末尾添加L 以将其声明为64 位整数。下划线是 Java 最新版本中的一项新功能,可让数字文字更具可读性。
猜你喜欢
  • 2018-04-24
  • 2012-09-06
  • 2012-11-08
  • 2019-01-15
  • 2016-09-15
  • 2021-12-31
  • 2015-01-23
  • 2019-06-19
相关资源
最近更新 更多