8

如何获得伦敦当前的本地挂钟时间(自 1970 年 1 月 1 日以来的毫秒数)?由于我的应用程序可以在任何位置的服务器上运行,我想我需要使用“欧洲/伦敦”的时区。我还需要考虑夏令时,即应用程序应在“夏季”期间增加一个小时。

我更喜欢使用标准的 java.util 库。

它是否正确?

TimeZone tz = TimeZone.getTimeZone("Europe/London") ;
Calendar cal = Calendar.getInstance(tz);
return cal.getTime().getTime() + tz.getDSTSavings();

谢谢

4

3 回答 3

16

我不确定这个数量代表什么,因为“自 1970 年 1 月 1 日以来的毫秒数”不会因位置或夏令时而异。但是,也许这个计算对你有用:

TimeZone london = TimeZone.getTimeZone("Europe/London");
long now = System.currentTimeMillis();
return now + london.getOffset(now);

大多数应用程序最好使用 UTC 时间或本地时间;这两者都不是。您可以像这样获取特定区域的 UTC 时间和时间:

Instant now = Instant.now(); /* UTC time */
ZonedDateTime local = now.atZone(ZoneId.of("Europe/London"));
于 2010-03-29T18:27:16.043 回答
5

其他人说这样做可能不是一个好主意 - 我相信这取决于您的情况,但使用 UTC 肯定是需要考虑的。

但是,我认为您在这里遗漏了一些东西:自 1970 年 1 月 1 日UTC以来发生的秒数(这是 Unix 纪元始终定义的方式 - 实际上与伦敦相同,因为该日期的偏移量是0) 可通过以下任何表达式获得:

System.currentTimeMillis()
new Date().getTime()
Calendar.getInstance().getTime().getTime()

如果您考虑一下,自该特定时刻以来的毫秒数不会根据您所在的时区而改变。

哦,还有正常的建议 - 要获得更好的日期和时间 API,请参阅Joda Time

于 2010-03-29T18:28:00.410 回答
3

要获取伦敦的当前时间:

SimpleDateFormat f = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");
f.setTimeZone(TimeZone.getTimeZone("Europe/London"));
System.out.println(f.format(GregorianCalendar.getInstance().getTime()));
于 2011-04-01T13:58:08.440 回答