我一直在尝试将时间转换为从纪元到今天,并在东部标准时间显示。以下是远程计算机上的输出(它是远程托管的):
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");
答案 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个字母代码,因为它们既不标准也不唯一。而是使用proper time zone names,通常是大陆+城市。
java.util.Date和.Calendar&与Java捆绑在一起的SimpleDateFormat类非常麻烦。使用具有更新时区数据库的合适日期时间库。对于Java,这意味着Joda-Time或Java 8中的新java.time包(受Joda-Time启发)。
我建议你从epoch起避免使用毫秒。快速混乱,因为人类阅读时数字毫无意义。让日期时间库为您管理毫秒。
通常最好指定所需/预期的时区。如果省略时区,则所有主要日期时间库(java.util.Date,Joda-Time,java.time)都应用JVM的默认时区。
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 );