一直在打击我的脑袋,不知道我在这里做错了什么。
我正在测试某个时区的inDaylightTime()方法,但在这种情况下应该返回“true”时返回“false”。
import java.util.TimeZone;
import java.util.Date;
public class TimeZoneDemo {
public static void main( String args[] ){
Date date = new Date(1380931200); // Sat, 05 Oct 2013, within daylight savings time.
System.out.println("In daylight saving time: " + TimeZone.getTimeZone("GMT-8:00").inDaylightTime(date));
}
}
当结果显示“真实”时,此代码会继续打印“false”。
我在这里缺少什么?非常感谢任何指导。
答案 0 :(得分:4)
您指定的时区为GMT-8:00
- 这是一个固定的时区,比UTC 永久晚8小时。它没有观察夏令时。
如果您实际意味着太平洋时间,则应指定America/Los_Angeles
作为时区ID。请记住,不同时区在一年中的不同时间在标准时间和夏令时之间切换。
此外,new Date(1380931200)
实际上是在1970年1月 - 你的意思是new Date(1380931200000L)
- 不要忘记自Unix时代以来这个数字是毫秒,而不是秒
答案 1 :(得分:1)
Jon Skeet的回答是正确的。
为了好玩,以下是使用Java 7中的第三方库Joda-Time 2.3的源代码解决方案。
DateTimeZone类有一个方法isStandardOffset。唯一的技巧是该方法需要很长的时间,支持DateTime实例的毫秒数,通过调用DateTime类'超类'(BaseDateTime)方法getMillis来访问。
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
org.joda.time.DateTimeZone losAngelesTimeZone = org.joda.time.DateTimeZone.forID("America/Los_Angeles");
org.joda.time.DateTime theSecondAt6PM = new org.joda.time.DateTime( 2013, 11, 2, 18, 0, losAngelesTimeZone ) ;
org.joda.time.DateTime theThirdAt6PM = new org.joda.time.DateTime( 2013, 11, 3, 18, 0, losAngelesTimeZone ) ; // Day when DST ends.
System.out.println("This datetime 'theSecondAt6PM': " + theSecondAt6PM + " is in DST: " + losAngelesTimeZone.isStandardOffset(theSecondAt6PM.getMillis()));
System.out.println("This datetime 'theThirdAt6PM': " + theThirdAt6PM + " is in DST: " + losAngelesTimeZone.isStandardOffset(theThirdAt6PM.getMillis()));
运行时,请注意偏离UTC的差异(-7与-8)...
This datetime 'theSecondAt6PM': 2013-11-02T18:00:00.000-07:00 is in DST: false
This datetime 'theThirdAt6PM': 2013-11-03T18:00:00.000-08:00 is in DST: true
关于Joda-Time ......
// Joda-Time - The popular alternative to Sun/Oracle's notoriously bad date, time, and calendar classes bundled with Java 7 and earlier.
// http://www.joda.org/joda-time/
// Joda-Time will become outmoded by the JSR 310 Date and Time API introduced in Java 8.
// JSR 310 was inspired by Joda-Time but is not directly based on it.
// http://jcp.org/en/jsr/detail?id=310
// By default, Joda-Time produces strings in the standard ISO 8601 format.
// https://en.wikipedia.org/wiki/ISO_8601
// About Daylight Saving Time (DST): https://en.wikipedia.org/wiki/Daylight_saving_time
// Time Zone list: http://joda-time.sourceforge.net/timezones.html