将纪元时间转换为日期

2022-09-01 09:22:41

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

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

星期三 十月 12 08:34:59 GMT+05:30 2011

12/10/2011 03:04:59

12/10/2011 14:04:59


答案 1

编辑:好的,所以你不希望你的当地时间(不是澳大利亚)对结果产生影响,而是澳大利亚时区。你现有的代码应该绝对没问题,尽管悉尼目前是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...

编辑:请注意,如果您的系统不知道时区,将显示UTC。例如,如果我更改即将使用的代码,它将显示UTC值两次。我建议你打印出来,看看它说了什么...并检查您的代码是否有拼写错误太:)Australia/SydneyTimeZone.getTimeZone("blah/blah")TimeZone.getTimeZone("Australia/Sydney").getDisplayName()


答案 2

以下是现代答案(从2014年起有效)。被接受的答案在2011年是一个非常好的答案。这些天我建议没有人使用 和 类。使用现代Java日期和时间API,这一切都变得更加自然。DateDateFormatSimpleDateFormat

要从 millis 获取日期时间对象,请执行以下操作:

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

如果等于 ,这将得到 .如果代码以某种奇怪的方式最终出现在不知道澳大利亚/悉尼时区的JVM上,您可以确保通过异常收到通知。millis1318388699000L2011-10-12T14:04:59+11:00[Australia/Sydney]

如果您希望日期时间采用字符串格式进行演示:

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