Java: Convert MST to EST
我一直在尝试将时间从转换到今天,并在东部标准时间显示。 以下是远程计算机上的输出(它是远程托管的):
1 2 3 |
不知道
无论我做什么,我都无法将日光节省下来(目前是EST时区的Daylights节省时间); 我要么以PST,GMT或UTC结束,当我得到"EST"时,它要么是随机值,要么落后1小时或落后3小时。
我想使用此DateFormat格式化输出:
1 |
只需使用
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" ) ); |
如果您真的想要自纪元以来的毫秒数,请调用
1 | long millis = dateTimeToronto.getMillis(); |
如果你需要一个java.util.Date用于其他类...
1 |
虽然Joda-Time使用ISO 8601标准格式作为其默认值,但您可以指定其他格式来生成字符串。
1 2 | DateTimeFormatter formatter = DateTimeFormat.forPattern("MMM dd, yyyy h:mm a z" ); String output = formatter.print( dateTimeToronto ); |