2

当我运行以下行时,

    System.out.println(java.util.TimeZone.getDefault());

我得到以下输出。

  sun.util.calendar.ZoneInfo[id="Asia/Calcutta",
  offset=19800000,
  dstSavings=0,
  useDaylight=false,
  transitions=6,
  lastRule=null]

System.out.println(Locale.getDefault());

`en_US` 

我的疑问是

怎么会Localeen_US,当我Zone idAsia/Calcutta

在第一个输出中,我不明白什么是offset, dstSavings, useDaylight, transitions and rules ?

任何人都可以帮助理解这些。

提前致谢...

4

2 回答 2

2

检查此问题以了解 Locale.getDefault() 的实际工作原理。

至于你的输出System.out.println(java.util.TimeZone.getDefault());

  1. DST Savings:基本实现对于使用夏令时的时区返回 3600000(1 小时),对于不使用夏令时的时区返回 0
  2. 偏移量:这是您的时区与 GMT 的偏移量。对于印度,它是 5hr30min,即 19800000 毫秒
  3. UseDaylight:这表明该时区没有日光调整。
  4. 转换:这是指时区的夏令时转换。
  5. LastRule:返回一个 SimpleTimeZone 对象,表示最后一个 GMT 偏移量和 DST 时间表;如果此时区不遵守 DST,则返回 null。

希望这可以帮助。

于 2013-05-31T05:24:35.550 回答
2

Locale无关,TimeZone如果你愿意,你可以在澳大利亚用法语设置你的电脑......你不需要法国时区。

要了解有关 TimeZone 的更多信息,您应该阅读论文:

使用夏令时

public abstract boolean useDaylightTime()

查询该时区是否使用夏令时。

什么是夏令时

获得DSTSavings

public int getDSTSavings()

返回要添加到本地标准时间以获取本地挂钟时间的时间量。

所以这是 UTC + TimeZone + (DSTSavings - 0 或 1 小时) 之间的差异。如果您当前处于 DST 节省模式,将返回 1 小时。

规则

规则是指 DST 生效的日期和不再生效的日期。更多信息SimpleTimeZone

过渡

该数组描述了该时区的 GMT 偏移量的转换,包括原始偏移量变化和夏令时变化。一个长整数由四个位字段组成。

最重要的 52 位字段表示从 1970 年 1 月 1 日 00:00:00 GMT 开始的以毫秒为单位的转换时间。下一个 4 位字段是保留的,并且必须为 0。下一个 4 位字段是 offsets[] 的索引值,用于转换时的夏令时量。如果此值为零,则表示没有夏令时,索引值不为零。最低有效 4 位字段是 offsets[] 的索引值,用于转换时的总 GMT 偏移量。

如果此时区不遵守夏令时并且过去从未更改过任何 GMT 偏移量,则此值为空。

于 2013-05-31T05:13:57.893 回答