Date对象和Calendar之间的日期计算不同

时间:2013-12-26 19:59:03

标签: java date datetime calendar

我正在编写一个代码来添加当前日期的天数。我有两个解决方案:

解决方案1 ​​

Date current = new Date();

// Add 100 days
Date d = new Date ( current.getTime() + 100 * 24 * 60 * 60 * 1000 );

System.out.println(d);

解决方案2

Date current = new Date();

GregorianCalendar c = new GregorianCalendar();
c.setTime(current);
c.add(Calendar.DATE, 100);

System.out.println(c.getTime());

RESULT

SOLUTION 1: Sat Apr 05 14:56:33 CDT 2014

SOLUTION 2: Sat Apr 05 13:56:33 CDT 2014

solution_2的结果比solution_11小时的结果少。

任何人都有任何想法?谢谢!

2 个答案:

答案 0 :(得分:9)

解决方案2考虑了夏令时,而解决方案1却没有。因此存在差异。

在从夏季到冬季过渡的日子,反之亦然,第一种方法假定,这一天不是24小时。

答案 1 :(得分:1)

夏令时

从现在开始的六个月将跨越美国内布拉斯加州林肯市夏令时的开始。

  

2014年3月9日(星期日)凌晨2:00:00时钟转发1小时至2014年3月9日(星期日)当地日光时间凌晨3:00:00

http://www.timeanddate.com/worldclock/clockchange.html?n=132&year=2014

夏令时(DST)是避免进行自己的日期时间计算的一​​个很好的理由。请使用称职的图书馆。

约达时间

解决方案1和解决方案2都不好。 java.util.Date/Calendar类非常糟糕,应该避免使用。它们在Java 8中被新的java.time.* classes取代,其设计灵感来自Joda-Time库。

下面的示例代码使用在Java 7中运行的Joda-Time 2.3。

时区

您的代码无法解决时区问题。指定时区是一种比默认时区更好的做法。我的示例代码使用林肯,美国东北部的时区(“America / Indiana / Knox”)。

示例代码

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;

// Specify a time zone rather than rely on defaults.
DateTimeZone timeZone = DateTimeZone.forID( "America/Indiana/Knox" );

DateTime dateTime = new DateTime( timeZone );
DateTime dateTimeLater = dateTime.plusDays( 100 );

// If you are focusing on the day itself rather than a particular time of day, then use first moment of the day.
DateTime dateTimeStartOfDay = new DateTime( timeZone ).withTimeAtStartOfDay();
DateTime dateTimeLaterStartOfDay = dateTimeStartOfDay.plusDays( 100 ).withTimeAtStartOfDay();

转储到控制台...

System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTimeLater: " + dateTimeLater );
System.out.println( "dateTimeStartOfDay: " + dateTimeStartOfDay );
System.out.println( "dateTimeLaterStartOfDay: " + dateTimeLaterStartOfDay );
System.out.println( "dateTimeLaterStartOfDay in UTC: " + dateTimeLaterStartOfDay.toDateTime( DateTimeZone.UTC ) );

跑步时......

dateTime: 2013-12-26T23:12:33.527-06:00
dateTimeLater: 2014-04-05T23:12:33.527-05:00
dateTimeStartOfDay: 2013-12-26T00:00:00.000-06:00
dateTimeLaterStartOfDay: 2014-04-05T00:00:00.000-05:00
dateTimeLaterStartOfDay in UTC: 2014-04-05T05:00:00.000Z

转换为j.u.Date

如果您需要转换为java.util.Date以与其他代码一起使用,请调用toDate方法。

java.util.Date date = dateTime.toDate();