Java:时区为什么不同时区给出相同的毫秒值?

13
我有以下的代码,我的目标是返回以毫秒为单位的 GMT+0 时间。但为什么我总是得到本地时区的毫秒数?
```html

我有以下的代码,我的目标是返回以毫秒为单位的 GMT+0 时间。但为什么我总是得到本地时区的毫秒数?

```
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
Calendar cal2 = Calendar.getInstance();
System.out.println("Time zone id is:"+cal.getTimeZone().getID()+";time in millisec:"+cal.getTimeInMillis());
System.out.println("Time zone id is:"+cal2.getTimeZone().getID()+";time in millisec:"+cal2.getTimeInMillis());

输出结果为:
时区标识为:GMT;毫秒时间:1332740915154
时区标识为:Europe/Helsinki;毫秒时间:1332740915154

为什么不同的时区会给出相同的毫秒值?
我认为如果是GMT+0,则与本地时区相比,它应该有不同的毫秒值。


你的系统使用的时区是什么? - sgowd
System.currentTimeMillis()是怎么样的呢? - user84592
我的时区是GMT+2,夏令时生效。 - user84592
现代注释:我建议您不要使用CalendarTimeZone。这些类设计不佳且已经过时。相反,使用来自Java时间和日期API(java.time)Instant。如果需要表示时区,则使用ZoneId - Ole V.V.
3个回答

24
为什么不同的时区返回相同的毫秒值?
因为这是它的意图。根据文档:
(返回)自纪元以来的当前时间作为UTC的毫秒数。
换句话说,它是由getTime返回的Date中的值,它不依赖于时区。如果您想要依赖于时区的值,请使用Calendar.Get(Calendar.YEAR)等方法。
Calendar.getTime()和Calendar.getTimeInMillis()都返回代表日历内独立于时区和日历系统的瞬间的值。

我的疑问是时区是否提供毫秒或仅提供所请求的时区? - sgowd
@sans481:恐怕我不知道你在问什么,能否重新表达一下问题? - Jon Skeet
我不确定返回“自纪元以来的当前时间(以UTC毫秒为单位)”的确切含义。 - sgowd
@sans481:它表示自“1970年1月1日午夜UTC时刻”起经过的毫秒数,即Unix纪元。 - Jon Skeet
如果您需要依赖于时区的值,请使用 Calendar.Get(Calendar.YEAR) 等。-- 这正是我所需要的。谢谢 - Alkanshel
显示剩余3条评论

6

Java中的millisec是指自GMT+0 1970/01/01 00:00:00以来的毫秒数。它与时区无关。时区是格式化日期为可读字符串的属性。


这并不是时区的真正用途;这更像是日历的作用。时区是用来在UTC和本地时间之间进行转换的。 - Jon Skeet

1

getTimeInMillis() 方法返回自纪元以来的当前时间(以UTC毫秒为单位)。因此,即使两个日历对象具有不同的时区,您也会获得相同的毫秒数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接