【问题标题】:Unexpected value setting java calendar minutes意外值设置java日历分钟
【发布时间】:2014-02-18 08:06:37
【问题描述】:

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

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 Jan 26 14:53:42 EET 2014

这里有什么问题?

【问题讨论】:

    标签: java java.util.calendar


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      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.DateCalendarSimpleDateFormat

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

      要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

      从哪里获得 java.time 类?

      ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

      【讨论】:

        猜你喜欢
        • 2016-10-30
        • 1970-01-01
        • 2019-08-22
        • 2010-09-29
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 2018-09-18
        • 1970-01-01
        相关资源
        最近更新 更多