【问题标题】:Java calendar time, minute is wrongJava 日历时间,分钟是错误的
【发布时间】:2010-09-29 02:10:26
【问题描述】:

有人知道为什么 java.util.Caldendar 中的 MINUTE 方法返回不正确的分钟吗?

import java.util.Calendar;

public class Clock
{
    // Instance fields
    private Calendar time;

    /**
     * Constructor. Starts the clock at the current operating system time
     */
    public Clock()
    {
       System.out.println(this.time.HOUR_OF_DAY+":"+this.time.MINUTE);
    }
}

【问题讨论】:

  • 又一个例子说明 Java 的 Date + Calender API 有多糟糕......
  • 有什么想法可以解释为什么会这样吗?
  • 仅供参考,麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleTextFormat 现在是 legacy,被 java.time 类取代。

标签: java time


【解决方案1】:

tl;博士

ZonedDateTime.now( ZoneId.of( "America/Montreal" ) )
             .getMinute()

34
(如果当前时刻是 2016-01-23T12:34:56.789-05:00[America/Montreal])

详情

其他答案都是正确的。

java.time

完成这项工作的现代方法是使用 java.time 类来取代麻烦的旧旧日期时间类。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.now( z );  // zdt.toString(): 2016-01-23T12:34:56.789-05:00[America/Montreal]
int minute = zdt.getMinute();  // 34

关于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

【讨论】:

    【解决方案2】:

    导入 java.util.Calendar;

    公共类时钟 { // 实例字段 私人日历时间;

    /**
     * Constructor. Starts the clock at the current operating system time
     */
    public Clock()
    {
       time = Calendar.getInstance(); 
       System.out.println(this.time.get(Calendar.HOUR_OF_DAY) +
                           ":" + this.time.get(Calendar.MINUTE));
    }
    

    }

    ----0--------------- ;)

    【讨论】:

      【解决方案3】:

      HOUR_OF_DAYMINUTE 是公共静态字段,旨在传递给 Calendar#get(int)。通常,您希望在当前分钟使用Calendar.getInstance().get(Calendar.MINUTE)。不过,在您的示例中,您需要time.get(Calendar.MINUTE)

      【讨论】:

        【解决方案4】:

        Calendar.MINUTE 不是实际的分钟,而是传递给“get()”以获取值的常量索引值。例如:

        System.out.println(this.time.get(Calendar.HOUR_OF_DAY) + ":" + this.time.get(Calendar.MINUTE));
        

        【讨论】:

        • 我想不习惯 Javadoc 约定,java.sun.com/javase/6/docs/api/java/util/… 有点模棱两可。 “get 和 set 字段编号,指示一天中的小时。HOUR_OF_DAY 用于 24 小时制。例如,在晚上 10:04:15.250,HOUR_OF_DAY 为 22。”
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-25
        • 1970-01-01
        • 2014-02-18
        • 1970-01-01
        相关资源
        最近更新 更多