我一直在尝试转换从epoch到今天的时间,并以东部标准时间显示。以下是远程机器上的输出(它是远程托管的):
Date now = new Date(System.currentTimeMillis());
System.out.println(now.toString());
// Thu Apr 24 14:36:11 MST 2014
不知道MST
是什么,但我想在EST中获得自epoch以来的当前毫秒数,并在EST中显示结果。
无论我做什么,我都无法节省工作时间(目前是美国东部时间区的daylights savings Time);我要么在太平洋标准时间、格林尼治标准时间或UTC结束,当我得到"EST"时,它要么是一些随机值,要么落后1小时或3小时。
我希望输出使用以下DateFormat:进行格式化
DateFormat EXPIRE_FORMAT = new SimpleDateFormat("MMM dd, yyyy h:mm a z");
只需使用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,目前没有EST。这都是美国东部时间的春天。
上面打印
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)。
避免Epoch以来的毫秒数
我建议您避免使用自epoch以来的毫秒。由于数字在被人类读取时毫无意义,因此很快就会变得令人困惑。让日期时间库为您管理毫秒。
指定时区
通常最好指定所需/预期的时区。如果省略时区,所有主要的日期时间库(java.util.date、JodaTime、java.time)都会应用JVM的默认时区。
Joda时间示例
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" ) );
如果您真的想要自epoch以来的毫秒数,请调用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 );