Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将历元时间转换为日期_Java_Datetime_Timezone_Datetime Format - Fatal编程技术网

Java 将历元时间转换为日期

Java 将历元时间转换为日期,java,datetime,timezone,datetime-format,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

我尝试了一百万种不同的方法,但都没有用。任何帮助都将不胜感激

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年10月12日03:04:59


2011年10月12日14:04:59

编辑:好的,所以你不想让你的当地时间(不是澳大利亚)影响结果,而是澳大利亚时区。尽管不是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
我还建议您开始使用它,它只是一个更好的日期/时间API


编辑:请注意,如果您的系统不知道
澳大利亚/悉尼
时区,它将显示UTC。例如,如果我更改了要使用
TimeZone.getTimeZone(“blah/blah”)
的代码,它将显示UTC值两次。我建议您打印
TimeZone.getTimeZone(“澳大利亚/悉尼”).getDisplayName()
,看看上面写的是什么。。。还要检查代码是否有拼写错误:)

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

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

以下是现代答案(从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[澳大利亚/悉尼]
。如果代码以某种奇怪的方式出现在一个不知道澳大利亚/悉尼时区的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

这个代码很好。我不明白您想要实现什么,以及为什么这段代码不适合您。你能举一个输入和输出代码的例子吗?也许OP担心的问题是“澳大利亚/悉尼”的偏移量不是05:30,而是+10。看@Hades:你能说你的代码在什么方面不起作用吗?你看到了什么,你期待着什么?代码对我有效…1318386508000<这是纪元时间,单位为milis。现在我想把它转换成澳大利亚时间。格林尼治时间+10。我手机上的本地时间是GMT+5。(我想忽略这一点)@Hades:悉尼时间目前是UTC+11,而不是UTC+10。因此,如果唯一的问题是,你看到的时间与你预期的时间相差一个小时,那可能只是你的预期……问题是当我转换它时……系统打印+0 GMT时间,而不是澳大利亚时间。epoch 1318388699000周三10月12日08:34:59 GMT+05:30 2011 12/10/2011 03:04:59 12/10/2011 14:04:59这是我运行代码epoch 1318388699000周三10月12日08:34:59 GMT+05:30 2011 12/10/2011 03:04:59 12/10/2011 14:04时的输出:59@Hades:如果你在我的答案中运行完全简短但完整的程序,会发生什么?“系统打印+0 GMT时间”是什么意思?你的系统可能不知道澳大利亚/悉尼时区吗?我在运行android,我想它确实知道。编辑了我的答案要想让它起作用,
epoch
必须是一个
long
。这是一个
int
,您的乘法运算将溢出,您将得到不正确的结果。此外,我不认为OP要求一个
Long
结果,但也许其他人可以使用它。正如Ole V.V.所说,您需要将
Long
值相乘。您可以将
1000
更改为
1_000L
,最后使用
L
将其声明为64位整数。下划线是Java最新版本中的一项新功能,可以使数字文字更具可读性;我认为在计算机上运行它并不重要;我后来才发现。谢谢你更新的答案。给自己的时间操作指定明确的时区总是个好主意。感谢您对旧问题的汇报@地狱