私はこれを何日も機能させようとしてきましたが、髪を引き裂いています。私を助けるために、もう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_YEAR
s (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))