设置java日历分钟的意外值

时间:2014-01-27 13:03:13

标签: java java.util.calendar

我正在尝试创建一个时间间隔,因为起点是当前时间,最小值和最大值是由用户设置的特殊变量(upperBound)计算的。所以代码看起来像:

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

但我希望(改变之后):Sun 1月26日14: 53 :42 EET 2014

这里有什么问题?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

TL;博士

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

详细

现代的方法是使用java.time类来取代麻烦的旧遗留Calendar类。

使用java.time

Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(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.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore