关于datetime:Java:将MST转换为EST

Java: Convert MST to EST

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

1
2
3
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格式化输出:

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


只需使用DateFormat#setTimeZone(TimeZone)设置您希望时间显示的时区

1
2
3
4
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,目前没有EST。这是春天的所有EDT。

以上打印

1
Apr 24, 2014 5:53 PM EDT


Sotirios Delimanolis的评论和答案是正确的。

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

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

避免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中的示例代码。

1
2
3
4
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对象具有相同的毫秒数 - 自从 - 纪元。

1
long millis = dateTimeToronto.getMillis();

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

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

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

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