Java:将MST转换为EST

时间:2014-04-24 21:41:33

标签: java datetime timezone date-format

我一直在尝试将时间转换为从纪元到今天,并在东部标准时间显示。以下是远程计算机上的输出(它是远程托管的):

Date now = new Date(System.currentTimeMillis());
System.out.println(now.toString());
// Thu Apr 24 14:36:11 MST 2014

不知道MST是什么,但是我希望从EST中的epoch开始获得当前的毫秒数,并在EST中显示结果。

无论我做什么,我都无法将日光节省下来(目前是EST时区的Daylights节省时间);我要么以PST,GMT或UTC结束,当我得到“EST”时,它要么是随机值,要么落后1小时或落后3小时。

我希望使用此DateFormat格式化输出:

DateFormat EXPIRE_FORMAT = new SimpleDateFormat("MMM dd, yyyy h:mm a z");

2 个答案:

答案 0 :(得分:3)

只需使用DateFormat#setTimeZone(TimeZone)

设置您希望时间显示的时区
Date now = new Date(System.currentTimeMillis());
DateFormat EXPIRE_FORMAT = new SimpleDateFormat("MMM dd, yyyy h:mm a z");
EXPIRE_FORMAT.setTimeZone(TimeZone.getTimeZone("America/Montreal")); // or whatever relevant TimeZone id 
System.out.println(EXPIRE_FORMAT.format(now));

AFAIK,there is no EST currently. It's all EDT in Spring.

以上打印

Apr 24, 2014 5:53 PM EDT

答案 1 :(得分:2)

评论和answer by Sotirios Delimanolis是正确的。

避免使用3或4个字母时区代码

您应该避免使用时区的3或4个字母代码,因为它们既不标准也不唯一。而是使用proper time zone names,通常是大陆+城市

避免使用j.u.Date

java.util.Date和.Calendar&与Java捆绑在一起的SimpleDateFormat类非常麻烦。使用具有更新时区数据库的合适日期时间库。对于Java,这意味着Joda-Time或Java 8中的新java.time包(受Joda-Time启发)。

避免Milliseconds-Since-Epoch

我建议你从epoch起避免使用毫秒。快速混乱,因为人类阅读时数字毫无意义。让日期时间库为您管理毫秒。

指定时区

通常最好指定所需/预期的时区。如果省略时区,则所有主要日期时间库(java.util.Date,Joda-Time,java.time)都应用JVM的默认时区。

Joda-Time示例

Joda-Time 2.3中的示例代码。

DateTimeZone timeZoneToronto = DateTimeZone.forID( "America/Toronto" );
DateTime dateTimeToronto = new DateTime( timeZoneToronto ); // Current moment.
DateTime dateTimeUTC = dateTimeToronto.withZone( DateTimeZone.UTC );
DateTime dateTimeParis = dateTimeToronto.withZone( DateTimeZone.forID( "Europe/Paris" ) );

如果你真的想要自纪元以来的毫秒,请调用getMillis方法。在上面的示例代码中,所有三个DateTime对象都具有相同的毫秒数 - 从epoch开始。

long millis = dateTimeToronto.getMillis();

如果你需要一个java.util.Date用于其他类...

java.util.Date date = dateTimeToronto.toDate();

虽然Joda-Time使用ISO 8601标准格式作为默认格式,但您可以指定其他格式来生成字符串。

DateTimeFormatter formatter = DateTimeFormat.forPattern( "MMM dd, yyyy h:mm a z" );
String output = formatter.print( dateTimeToronto );