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最新版本中的一项新功能,可以使数字文字更具可读性;我认为在计算机上运行它并不重要;我后来才发现。谢谢你更新的答案。给自己的时间操作指定明确的时区总是个好主意。感谢您对旧问题的汇报@地狱