将纪元时间转换为日期

时间:2011-10-12 13:39:00

标签: java datetime timezone datetime-format

我尝试了一百万种不同的方式,但无济于事。任何帮助将非常感激。

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但当然我不希望这是导致这种转换的因素。

编辑 -

运行确切代码时输出

epoch 1318388699000

Wed Oct 12 08:34:59 GMT + 05:30 2011

12/10/2011 03:04:59

12/10/2011 14:04:59

3 个答案:

答案 0 :(得分:27)

编辑:好的,所以你不希望你的本地时间(不是澳大利亚)对结果有所贡献,而是你的澳大利亚时区。你现有的代码应该是绝对正常的,虽然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()并查看它的内容......并检查您的代码是否也出现错别字:)

答案 1 :(得分:9)

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

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

答案 2 :(得分:6)

这是现代答案(从2014年开始有效)。接受的答案是2011年的一个非常好的答案。这些天我建议没有人使用DateDateFormatSimpleDateFormat类。使用现代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