7

我多次遇到同样的问题。

这个问题也有同样的问题,并且得到了同样的解决方案, 如何在android中比较已知时间和当前时间?

问题 :

当我Calendar calCurr = Calendar.getInstance();用来获取当前日期和时间的日历对象时,它总是返回错误。

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

见我的例子:

    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

问题 :

  • 为什么它给出错误的输出?
  • 是那里的错误还是我对 Calendar 类的概念是错误的?
  • 告诉我应该为此做些什么?
4

8 回答 8

6

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

电流以英里为单位的时间 - 正常 Wed Apr 04 11:34:34 BST 2012

当前时间以英里为单位 - 更新后 Fri May 04 11:34:34 BST 2012

你能指望什么 ?以毫秒为单位也等于 30 天:

电流以英里为单位的时间 - 正常 1333535834557

当前时间以英里为单位 - 更新后 1336127834557

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

1336127834557 - 1333535834557 = 2 592 000 000

2592000000 / 86400000 = 30

1970 年之后的今天日期(以毫秒为单位)是1333536754 ......这很合适,我认为没有问题。

编辑

您的问题是您将月份设置为 3 月……您需要设置 2..因为月份的索引从 0 到 11。

于 2012-04-04T10:36:10.070 回答
5

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

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

例如calCurr.set(Calendar.MONTH,2)calCurr.add(Calendar.DAY,1)

于 2012-04-04T10:36:19.503 回答
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

为什么要在月份中添加 ONE?日期和日历中的月份都是从零开始的 - 无需加 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
于 2012-04-04T13:33:43.977 回答
2

日历月份是零索引的。所以当想要设置为 3 月 2 日而不是 3 日

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

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

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

于 2012-04-04T10:37:31.933 回答
1

Java 基于日期的 API 设计不正确。在未来的版本中,我认为 API 的一些问题是计划解决的。

我建议使用JodaTime

于 2012-04-04T10:41:35.140 回答
0

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

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

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

这就是每次调用 calCurr.getTimeInMillis(); 时获得相同时间值的原因;

希望这可以帮助。

于 2012-04-04T12:29:12.980 回答
0

这是Calendar. 由于某些原因,一月是第 0 个月,年份也不是很合乎逻辑。

我推荐 Joda 时间图书馆。

于 2012-04-04T10:35:03.687 回答
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;
于 2012-04-04T10:39:40.723 回答