5

私はこれを何日も機能させようとしてきましたが、髪を引き裂いています。私を助けるために、もう1組の目が必要だと思います。

データベースに保存された「エントリ」があり、それぞれに入力された秒の Unix タイムスタンプが付いています。ユーザーが任意の日付を選択して、同じ週に保存されたエントリを表示できるシステムがあります。ユーザーにカスタムの週の最初の曜日を設定させたときに問題が発生します。Calendar.setFirstDayOfWeek().週の最初の曜日が日曜日以外に設定されていると、データベースから正しい戻り値を取得できません (この例では、私は使用しています火曜日)。

public void getEntries() {

    /* Make sure temp Calendar has same first day */
    temp = Calendar.getInstance();
    temp.setFirstDayOfWeek(date.getFirstDayOfWeek());
    /* Common date ranges in unix time */
    long oneday = 86400000L;
    long oneweek = 604800000L;
    long onemonth = 2628000000L;
    long oneyear = 31536000000L;
    /* The custom date in unix time. For example, the user may have selected Dec. 1, 2012 */
    long set_time = date.getTimeInMillis();
    entries.clear();
    dba.open();

    /* This query gets entries within 1 week and 1 day of the user-set date just to be safe */
    Cursor cc = dba.query("Date < " +(set_time+oneweek+oneday)+ " AND Date > " +(set_time-oneday-oneweek));
            if(cc.moveToFirst()) do {
                /* Set temp calendar to the timestamp of the entry in database */
                long unix = cc.getLong(1);
                temp.setTimeInMillis(unix);
                System.out.println("Temp calendar set to "+temp.getTime().toGMTString()+ " fdow("+temp.getFirstDayOfWeek()+") week("+temp.get(Calendar.WEEK_OF_YEAR)+"), user calendar set to "+date.getTime().toGMTString()+" fdow("+date.getFirstDayOfWeek()+") week("+date.get(Calendar.WEEK_OF_YEAR)+")");
                if(temp.get(Calendar.WEEK_OF_YEAR) == date.get(Calendar.WEEK_OF_YEAR)
                && temp.get(Calendar.YEAR) == date.get(Calendar.YEAR) )
                    /* Entry object is instantiated and added to ArrayList if WEEK_OF_YEAR in temp calendar matches WEEK_OF_YEAR in global calendar */
                    entries.add(createEntryFromCursor(cc));
            } while(cc.moveToNext());

}

私のテストでは、2012 年 11 月 30 日にエントリがあるという事実を知っています。週の最初の曜日が火曜日に設定されている (エントリは金曜日であった) 場合、ユーザーが日付を次のように設定すると、1 つの結果が返されます。 12 月 1 日、ユーザーが 11 月 26 日 (月曜日) を設定した場合、結果はありません。ただし、両方に対して1つの結果が得られます。どうしたの?!

編集

私はまだ本当に助けが必要です!上記を現在のコードで更新しました。私はまだ奇妙な結果を得ています。たとえば、週の最初の日を月曜日にすると、次のようになりますSystem.out

12-09 11:46:38.465: I/System.out(15130): Temp calendar set to 9 Dec 2012 19:29:59 GMT fdow(2) week(49), user calendar set to 9 Dec 2012 14:51:59 GMT fdow(2) week(50)

これは、2012 年 12 月 9 日が 2 つの異なるWEEK_OF_YEARs (49/50) に含まれていることを示しています。ただし、両方のカレンダーの最初の曜日は 2 です。

解決

を取得するのをやめ、その週のWEEK_OF_YEAR開始と終了の s を取得するという提案に従いました。Date

            // get rollback amt
            temp.setTimeInMillis(set_time);
            int rollback = 0;
            int dayofweek = date.get(Calendar.DAY_OF_WEEK);
            while(dayofweek != temp.getFirstDayOfWeek()) {
                dayofweek--;
                if(dayofweek == 0) dayofweek = 7;
                rollback--;
            }
            int rollfwd = rollback + 6;

            // get start bound
            temp.setTimeInMillis(set_time);
            temp.roll(Calendar.DAY_OF_YEAR, rollback);
            temp.set(Calendar.HOUR_OF_DAY, 0);
            temp.set(Calendar.MINUTE, 1);
            Date start = temp.getTime();
            // get end bound
            temp.setTimeInMillis(set_time);
            temp.roll(Calendar.DAY_OF_YEAR, rollfwd);
            temp.set(Calendar.HOUR_OF_DAY, 23);
            temp.set(Calendar.MINUTE, 59);
            Date end = temp.getTime();

次にDate、エントリがそれらの間にあるかどうかを確認できます。

if(entrydate.after(start) && entrydate.before(end))
4

3 に答える 3

3

androidでSimpleDateFormatを使用して、week_of_yearを取得し、ユーザーが選択した日付をクエリするための条件を検証できますか。

ステップ1:週を選択するためのユーザーの選択を取得します。 例:27

ステップ2:週の始まりと終わりを取得します。 27週目の始まりから27週目の終わりまで。

ステップ3:この2つの境界条件を使用して、結果セットをフィルタリングします。

これが問題の解決に役立つことを願っています。

于 2012-12-10T10:59:04.780 に答える
3

12-09 11:46:38.465: I/System.out(15130): 一時カレンダーを 2012 年 12 月 9 日 19:29:59 GMT fdow(2) 週 (49) に設定、ユーザー カレンダーを 2012 年 12 月 9 日 14:51 に設定:59 GMT fdow(2) 週(50)

Temp カレンダーの値とユーザー カレンダーの値の間には 5 時間近くの差があります。

GMT を使用して日付文字列を出力しています。

temp.getTime().toGMTString()

一方、Calendar オブジェクトはローカル タイムゾーンを使用します。

temp.get(Calendar.WEEK_OF_YEAR)+")

これらの時刻は、GMT では同じ曜日/週である可能性がありますが、ローカル タイムゾーンでは異なります。

于 2012-12-14T11:26:26.210 に答える
2

これにより、その週の月曜日からの日数が得られます

int daysSinceMonday = (7 + calendar.get(Calendar.DAY_OF_WEEK) - Calendar.MONDAY) % 7;

これを使用して、週の始まりを再計算します。

于 2012-12-14T18:55:18.900 に答える