【发布时间】:2018-02-23 23:48:37
【问题描述】:
在以下代码中,range 仅在 range 小于 30 时才等于 durationInDays。如果等于或大于 30,durationInDays 始终为 range - 1
Calendar c = Calendar.getInstance();
Date now = new Date();
c.setTime(now);
int range = 35;
c.add(Calendar.DATE, range);
Date then = c.getTime();
Duration duration = Duration.between(now.toInstant(), then.toInstant());
int durationInDays = (int)duration.toDays();
调试本例时,变量设置如下:
this = {CalTest@871}
c = {GregorianCalendar@876} "java.util.GregorianCalendar[time=1522449516301,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Dublin",offset=0,dstSavings=3600000,useDaylight=true,transitions=228,lastRule=java.util.SimpleTimeZone[id=Europe/Dublin,offset=0,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2018,MONTH=2,WEEK_OF_YEAR=13,WEEK_OF_MONTH=5,DAY_OF_MONTH=30,DAY_OF_YEAR=89,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=5,AM_PM=1,HOUR=11,HOUR_OF_DAY=23,MINUTE=38,SECOND=36,MILLISECOND=301,ZONE_OFFSET=0,DST_OFFSET=3600000]"
now = {Date@877} "Fri Feb 23 23:38:36 GMT 2018"
range = 35
then = {Date@878} "Fri Mar 30 23:38:36 IST 2018"
duration = {Duration@879} "PT839H"
durationInDays = 34
为什么then 有 IST 时区?这种差异导致duration 略小于 35 天,四舍五入为 34。
【问题讨论】:
-
尝试打印
Instant值,你会明白为什么。 -
你知道
c.setTime(new Date());是多余的,因为Calendar.getInstance()现在已经“现在”初始化它了,对吧? -
您的默认时区是什么?打印
TimeZone.getDefault().getID() -
不要将可怕的旧遗留类 Date/Calendar 与现代 java.time 类混合。完全避免遗留类。仅使用 java.time。阅读Oracle Tutorial 并重新开始。并在发布前搜索 Stack Overflow。这些话题已经被处理过很多次了。
标签: java time calendar timezone