我正在编写一个代码来添加当前日期的天数。我有两个解决方案:
解决方案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小时的结果少。
任何人都有任何想法?谢谢!
答案 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
如果您需要转换为java.util.Date以与其他代码一起使用,请调用toDate
方法。
java.util.Date date = dateTime.toDate();