参考答案:
SimpleTimeZone 是 TimeZone 的具体子类,表示一个使用格里高利历的时区。此类保持一个相对 GMT 的偏移量,称为原始偏移量,并保持夏令时安排的开始和结束规则。由于它仅为每一项保持单个值,因此它无法处理相对 GMT 的偏移量以及夏令时安排中的历史更改,除了setStartYear 方法可以指定开始实施夏令时安排的年份之外。
要构造一个带有夏令时安排的 SimpleTimeZone,可以使用一组规则,即开始规则 和结束规则 来描述该安排。夏令时开始或结束的那一天通过 month、day-of-month 和 day-of-week 值联合指定。month 值由 Calendar 的MONTH 字段值表示,如Calendar.MARCH。day-of-week 值由 Calendar 的DAY_OF_WEEK 值表示,如SUNDAY。这些值的组合含意如下。
一个月的具体某一天
要指定一个月的具体某一天,可将 month 和 day-of-month 设置为一个具体的值,并将 day-of-week 设置为 0。例如,要指定 3 月 1 日,可将 month 设置为MARCH,day-of-month 设置为 1,并将 day-of-week 设置为 0。
一个月的某一天或之后的星期几
要具体指定一个月的某一天或之后的星期几,可将 month 设置为一个具体的月份值,将 day-of-month 设置为在该日期或在该日期之后应用规则的那一天,并将 day-of-week 设置为负的DAY_OF_WEEK 字段值。例如,要指定 4 月的第二个星期天,可将 month 设置为APRIL,day-of-month 设置为 8,并将 day-of-week 设置为 -SUNDAY。
一个月的某一天或之前的星期几
要具体指定一个月的某一天或之前的星期几,可将 day-of-month 和 day-of-week 设置为负值。例如,要指定 3 月 21 日或之前的最后一个星期三,可将 month 设置为MARCH,将 day-of-month 设置为 -21,并将 day-of-week 设置为 -WEDNESDAY。
一个月的最后一个星期几
要指定一个月的最后一个星期几,可将 day-of-week 设置为DAY_OF_WEEK 值,并将 day-of-month 设置为 -1。例如,要设置 10 月的最后一个星期日,可将 month 设置为OCTOBER,将 day-of-week 设置为SUNDAY,并将 day-of-month 设置为 -1。
夏令时开始或结束的那一天的具体时间由该日期内的毫秒值指定。有三种指定时间的模式:WALL_TIME、STANDARD_TIME 和UTC_TIME。例如,如果夏令时在挂钟时间凌晨 2:00 结束,则可以在WALL_TIME 模式中用 7200000 毫秒指定该时间。在这种情况下,结束规则的挂钟时间与夏令时时间是一样的。
下面是构造时区对象的一些参数示例。
// Base GMT offset: -8:00
// DST starts: at 2:00am in standard time
// on the first Sunday in April
// DST ends: at 2:00am in daylight time
// on the last Sunday in October
// Save: 1 hour
SimpleTimeZone(-28800000,
"America/Los_Angeles",
Calendar.APRIL, 1, -Calendar.SUNDAY,
7200000,
Calendar.OCTOBER, -1, Calendar.SUNDAY,
7200000,
3600000)
// Base GMT offset: +1:00
// DST starts: at 1:00am in UTC time
// on the last Sunday in March
// DST ends: at 1:00am in UTC time
// on the last Sunday in October
// Save: 1 hour
SimpleTimeZone(3600000,
"Europe/Paris",
Calendar.MARCH, -1, Calendar.SUNDAY,
3600000, SimpleTimeZone.UTC_TIME,
Calendar.OCTOBER, -1, Calendar.SUNDAY,
3600000, SimpleTimeZone.UTC_TIME,
3600000)
这些参数规则也适用于设置规则的方法,如 setStartRule。