我想获得两个日期之间的所有夏令时(DST)小时.
这是我的示例代码:
public static void main(String[] args) {
Date startDate = new Date();
Calendar startCalendar = Calendar.getInstance();
startCalendar.setTime(startDate);
startCalendar.set(2014, 2, 1, 0, 0, 0);
startCalendar.set(Calendar.MILLISECOND, 0);
Date endDate = new Date();
Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(endDate);
endCalendar.set(2014, 2, 31, 0, 0, 0);
endCalendar.set(Calendar.MILLISECOND, 0);
DateTime startDateTime = new DateTime(startCalendar);
DateTime endDateTime = new DateTime(endCalendar).plusDays(1);
Hours hours = Hours.hoursBetween(startDateTime, endDateTime);
// actual is 744
System.out.println("Expected: 743, actual: " + hours.getHours());
}
Run Code Online (Sandbox Code Playgroud)
好吧,我显然错过了一些东西,但我无法发现我的错误.
主要问题是您未能指定时区.
当我在西雅图运行你的代码时,我743在2014年3月份得到了几个小时.为什么?因为我的默认时区.在美国西海岸,夏令时开始于2014年3月9日,周日,02:00.请参阅此页面,2014年的时间更改日期.那天,9日,实际上是23小时而不是24小时.
但是,如果冰岛的某个人运行完全相同的代码,她就会得到744.为什么?因为冰岛人太聪明了,无法忍受夏令时的废话.
另外,作为一个好习惯,你应该withTimeAtStartOfDay()在尝试使用几天时调用Joda-Time方法.以前我们使用Joda-Time的midnight方法,但是这些方法已被弃用,因为有些日历在某些日历中没有午夜.
提示:请注意以命名方式命名的Joda-Time方法standard,文档解释这意味着假设为24小时制.换句话说,这些方法忽略了夏令时变换.
下面是一些在Java 7中使用Joda-Time 2.3的示例代码.
// © 2013 Basil Bourque. This source code may be used freely forevery by anyone taking full responsibility for doing so.
// 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
// Time Zone list: http://joda-time.sourceforge.net/timezones.html
org.joda.time.DateTimeZone seattleTimeZone = org.joda.time.DateTimeZone.forID("America/Los_Angeles");
org.joda.time.DateTimeZone icelandTimeZone = org.joda.time.DateTimeZone.forID("Atlantic/Reykjavik");
// Switch between using 'seattleTimeZone' and 'icelandTimeZone' to see different results (23 vs 24).
org.joda.time.DateTime theNinth = new org.joda.time.DateTime( 2014, 3, 9, 0, 0, seattleTimeZone ) ; // Day when DST begins.
org.joda.time.DateTime theTenth = theNinth.plusDays( 1 ); // Day after DST begins.
// Using "hoursBetween()" method with a pair of DateTimes.
org.joda.time.Hours hoursObject = org.joda.time.Hours.hoursBetween( theNinth.withTimeAtStartOfDay(), theTenth.withTimeAtStartOfDay() );
int hoursInt = hoursObject.getHours();
System.out.println( "Expected 23 from hoursInt, got: " + hoursInt );
// Using an Interval.
org.joda.time.Interval interval = new Interval( theNinth.withTimeAtStartOfDay(), theTenth.withTimeAtStartOfDay() );
System.out.println( "Expected 23 from interval, got: " + org.joda.time.Hours.hoursIn(interval).getHours() );
// Using a Period with Standard days.
org.joda.time.Period period = new org.joda.time.Period( theNinth.withTimeAtStartOfDay(), theTenth.withTimeAtStartOfDay() );
org.joda.time.Hours standardHoursObject = period.toStandardHours();
System.out.println( "Expected 24 from standardHoursObject, got: " + standardHoursObject.getHours() );
Run Code Online (Sandbox Code Playgroud)