将纪元时间转换为日期

Had*_*des 19 java timezone datetime 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);
Run Code Online (Sandbox Code Playgroud)

以上不起作用.

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

编辑-

运行您的确切代码时的输出,

epoch 1318388699000

周五10月12日08:34:59 GMT + 05:30 2011

12/10/2011 03:04:59

12/10/2011 14:04:59

Jon*_*eet 31

编辑:好的,所以你不希望你当地的时间(不是澳大利亚)为结果做出贡献,而是要求澳大利亚时区.你现有的代码应该绝对没问题,虽然悉尼目前是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

12/10/2011 02:28:28
12/10/2011 13:28:28
Run Code Online (Sandbox Code Playgroud)

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

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


小智 11

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

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

  • 正如 Ole VV 所说,您需要乘以“长”值。您可以将“1000”更改为“1_000L”,并在末尾添加“L”,以将其声明为 64 位整数。下划线是 Java 最新版本中的一项新功能,旨在使数字文字更具可读性。 (2认同)

Ole*_*.V. 8

这是现代答案(从2014年开始有效).接受的答案是在2011年.这些日子非常精细的答案,我建议任何人使用Date,DateFormat以及SimpleDateFormat类.现代Java日期和时间API都更加自然.

要从millis获取日期时间对象:

    ZonedDateTime dateTime = Instant.ofEpochMilli(millis)
            .atZone(ZoneId.of("Australia/Sydney"));
Run Code Online (Sandbox Code Playgroud)

如果millis等于1318388699000L,这就给你了2011-10-12T14:04:59+11:00[Australia/Sydney].如果代码以某种奇怪的方式结束在不知道澳大利亚/悉尼时区的JVM上,您可以确保通过异常得到通知.

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

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

结果:

12/10/2011 14:04:59
Run Code Online (Sandbox Code Playgroud)

PS我不知道你的意思是"以上不起作用."在我的电脑上你的问题中的代码也打印出来12/10/2011 14:04:59.

  • 将明确的时区指定给自己的时间操作始终是个好主意。感谢您回报旧问题。@哈德斯 (2认同)