2014-01-27 26 views
0

我想创建一个时间间隔,起点是当前时间,最小值和最大值由用户设置的特殊变量(upperBound)计算。所以,代码如下:意外的值设置Java日历分钟

private static int upperBound = 1440; 
..... 
Calendar calendar = Calendar.getInstance(); 
System.out.println("Now:\t\t\t" + calendar.getTime()); 
calendar.set(Calendar.MINUTE, -upperBound); 
System.out.println("After the change:\t" + calendar.getTime()); 

,输出是:

Now:   Mon Jan 27 14:53:42 EET 2014 
After the change: Sun Jan 26 14:00:42 EET 2014 

但我希望是(变更后):太阳14年1月26日::42 EET 2014

这里有什么问题?

回答

1

您应该使用add()方法,不set

calendar.add(Calendar.MINUTE, -upperBound); 
0

TL;博士

Instant.now() 
     .plus(1440 , ChronoUnit.MINUTES) 

详细

现代的方式是与取代麻烦的旧传统的java.time类Calendar类。

使用java.time

Instant类表示UTCnanoseconds(最多9个小数位数)的分辨率在时间轴上一会儿。

Instant instant = Instant.now(); 

您可以添加大量的时间。

Instant later = instant.plus(24 , ChronoUnit.HOURS) ; 

如果您的意思是添加具体的分钟,那就这样吧。

Instant later = instant.plus(1440 , ChronoUnit.MINUTES); 

如果你想添加一个一天日历而言,考虑到异常,如日光节约时间(DST),必须应用时区。

ZoneId z = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = instant.atZone(z); 
ZonedDateTime zdtLater = zdt.plusDays(1); 

关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了日期时间类legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time项目现在位于maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310

从何处获取java.time类?

ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuartermore