7

私は何度も同じ問題に直面しました。

同じ問題がこの質問にあり、同じように解決策を得まし た、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

質問 :

  • なぜそれが間違った出力を与えているのですか?
  • そこにバグがあるのでしょうか、それともCalendarクラスに関する私の概念が間違っているのでしょうか。
  • そのために何をすべきだったか教えてください。
4

8 に答える 8

6

getDate()出力を変更すると、期待どおりに完全に機能します。

現在のミリ単位の時間-通常の水4月4日11:34:34BST2012

現在のミリ単位の時間-更新後金5月4日11:34:34BST2012

何を期待しますか?そして、ミリ秒でそれはまた30日に等しい:

電流のミリ単位の時間-通常1333535834557

現在のミリ単位の時間-更新後1336127834557

計算は(差、1日のミリ秒で割った値):

1336127834557 - 1333535834557 = 2 592 000 000

2592000000 / 86400000 = 30

そして、1970年以降のミリ秒単位の今日の日付は1333536754です...これは適切ですが、問題はありません。

編集

あなたの問題はあなたが3月に3のような月を設定していることです...あなたは2を設定する必要があります。月は0から11までインデックス付けされているからです。

于 2012-04-04T10:36:10.070 に答える
5

使用しないでくださいdate.getXXX()。を除くセッターまたはゲッターは使用しないでくださいDate.getTime()。それらはすべて非推奨です。それらを使用すると、予期しない結果が発生します。

を呼び出すとCalendar.getInstance()、すでに現在の日付に設定されています。日、月などを設定または追加する場合は、カレンダーに設定します。

calCurr.set(Calendar.MONTH,2)またはcalCurr.add(Calendar.DAY,1)

于 2012-04-04T10:36:19.503 に答える
2

暦月はゼロインデックスです。だから、3月に設定したいときは3ではなく2

また、Dateオブジェクトから年、月、日付を設定しないでください。カレンダーを日付に初期化する必要がある場合は、次のようにします。

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

Dateオブジェクトは、思っているロケールとは異なるロケールである可能性があることに注意してください。

于 2012-04-04T10:37:31.933 に答える
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を追加するのですか?日付とカレンダーの両方の月はゼロベースです-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 に答える
1

Java DateBasedAPIが適切に設計されていません。将来のバージョンでは、APIのいくつかの問題に対処する予定だと思います。

JodaTimeの使用をお勧めします。

于 2012-04-04T10:41:35.140 に答える
0

これは、の奇妙な実装ですCalendar。いくつかの理由で、1月は0か月目であり、年もあまり論理的ではありません。

城田タイムライブラリーをお勧めします。

于 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 に答える
0

Calendar.getInstance()を使用してCalendarオブジェクトを作成すると、Calendarオブジェクトのインスタンス変数 "time"が設定され、Calendar.setTimeInMillis()関数を使用した場合にのみこの値が変更されます。
Calendarオブジェクトのコードスニペット:

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

ここで、Calendar.getInstance()が呼び出されると、「isTimeSet」は「true」になり、時刻を更新せずに毎回「time」を返します。

これが、calCurr.getTimeInMillis()を呼び出すたびに同じ時間値を取得する理由です。

お役に立てれば。

于 2012-04-04T12:29:12.980 に答える