JAVA - 这是java.util.Calendar类中的错误还是什么?

时间:2012-04-04 10:30:02

标签: java android date calendar

我多次遇到同样的问题。

同样的问题是这个问题和得到的解决方案一样, How to compare known hours ad current hour in android?

问题:

当我使用Calendar calCurr = Calendar.getInstance();获取当前日期和时间的Calendar对象时,它总是让我错了。

我已经放了日志并检查了它并使其正确我必须在几年和几个月内添加,然后我得到了当前日期和时间的正确对象。

请参阅我的示例:

    Calendar calCurr = Calendar.getInstance();
    Log.i("Time in mili of Current - Normal", ""+calCurr.getTimeInMillis()); 
                // see what it gives? dont know why?

    Date date = new Date();
    calCurr.set(date.getYear()+1900, date.getMonth()+1, date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds());
                // so added one month to it

    Log.i("Time in mili of Current - after update", ""+calCurr.getTimeInMillis()); 
                // now get correct

问题:

  • 为什么输出错误?
  • 这是一个bug还是我对Calendar类的概念错了?
  • 告诉我应该做些什么 那个?

8 个答案:

答案 0 :(得分:6)

如果您更改为输出getDate(),它会按预期完美运行:

  

时间在当前的mili - 正常星期三04年4月4日11:34:34 BST 2012

     

当前的军事时间 - 更新后5月4日星期四04:34:34 BST 2012

你期待什么?并且在几十秒内它也等于30天:

  

当前的mili时间 - 正常1333535834557

     

当前的mili时间 - 更新后1336127834557

并且计算是(差异,除以一天中的毫秒数):

1336127834557 - 1333535834557 = 2 592 000 000

2592000000 / 86400000 = 30

今天的日期以1970年后的毫秒为1333536754 ......这很合适,我没有看到问题。

修改

你的问题是你正在为3月份设置月份为3 ...你需要设置2 ..因为月份的索引从0到11。

答案 1 :(得分:5)

请勿使用date.getXXX()。除Date.getTime()之外,请勿使用任何setter或getter。他们都被弃用了。使用它们会导致意想不到的结果。

如果您致电Calendar.getInstance(),则已将其设置为当前日期。如果您想设置或添加天,月等,请在日历上设置它们。

E.g。 calCurr.set(Calendar.MONTH,2)calCurr.add(Calendar.DAY,1)

答案 2 :(得分:2)

  

日历月份为零索引。因此,当想要设置为3月2而不是3

此外,请勿从Date对象设置年,月和日期。如果您必须将日历初始化为日期,请执行以下操作:

   Calendar cal = Calendar.getInstance();
   cal.setTime(date);

请注意,您的Date对象可能与您认为的语言环境不同。

答案 3 :(得分:2)

这不是一个错误,日历正在返回它应该的东西(至少在这里)。

Calendar calCurr = Calendar.getInstance();
Log.i("Time in mili of Current - Normal", ""+calCurr.getTimeInMillis()); 
            // see what it gives? dont know why?

我得到了1333546375707毫秒,这是正确的值(也是手工计算的) 你期待哪个价值?你怎么知道这是错的?


Date date = new Date();
calCurr.set(date.getYear()+1900, date.getMonth()+1, date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds());
            // so added one month to it

为什么在本月添加一个?日期和日历的月份都是从零开始的 - 无需添加1.


修改
手工计算(近似):

2012  - 42 years * 365.24 days/year * 86400 seconds/day
April - (31 + 29 + 31) days * 86400
4th   - 3 days * 86400
13:30 - 13.5 hours * 3600 seconds/hour
        ====================
        1333553112 seconds

答案 4 :(得分:1)

基于Java Date Based的API设计不当。 在未来的版本中,我认为API计划解决一些问题。

我建议使用JodaTime

答案 5 :(得分:0)

Calendar的奇怪实现。 由于某些原因,1月份是0月,而且年份也不合逻辑。

我推荐Joda时间库。

答案 6 :(得分:0)

我们使用下面的代码行来查找当前的日期和时间。我们这边工作正常。

            java.util.Calendar calc = java.util.Calendar.getInstance();

        int day = calc.get(java.util.Calendar.DATE);
        int month = calc.get(java.util.Calendar.MONTH)+1;
        int year = calc.get(java.util.Calendar.YEAR);

        String dayStr,monthStr;
        if(day<10){
            dayStr = "0"+day;
        }else{
            dayStr = ""+day;
        }
        if(month<10){
            monthStr = "0"+month;
        }else{
            monthStr = ""+month;
        }
        /*String currentdate = monthStr+"/"+dayStr+"/"+year+" ";*/
        String currentdate = dayStr+"/"+monthStr+"/"+year+" ";

        /*String currenttime = currentdate + String.valueOf(calc.get(java.util.Calendar.HOUR_OF_DAY))+ ":"+
        String.valueOf(calc.get(java.util.Calendar.MINUTE))+":"+String.valueOf(calc.get(java.util.Calendar.SECOND));*/

        return currentdate;

答案 7 :(得分:0)

使用Calendar.getInstance()创建Calendar对象时,将设置Calendar对象中的实例变量“time”,只有在使用时才会更改此值 Calendar.setTimeInMillis()函数。
Calendar对象的代码片段:

public long getTimeInMillis() {
        if (!isTimeSet) {
        updateTime();
    }
        return time;
    }

调用Calendar.getInstance()时,“isTimeSet”将变为“true”,并且每次都返回“time”而不更新时间。

这是您每次通话时获得相同时间值的原因 calCurr.getTimeInMillis();

希望这有帮助。