我一直试图让这个工作好几天,我正在撕裂我的头发。我想我只需要另外一双眼睛来帮助我。
我将“条目”存储在数据库中,每个条目在输入的第二个时间点都有一个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日(星期一),则无结果。但是,我得到了两个结果。怎么了?!
我仍然需要帮助!我用我当前的代码更新了上面的内容。我仍然得到奇怪的结果。例如,星期一的第一天,我从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
并按照建议获取本周的开始和结束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))
答案 0 :(得分:3)
你能否在android中使用SimpleDateFormat获取week_of_year并验证查询用户所选日期的条件。
步骤1:让用户选择选择周。 例如:27
第2步:获取本周开始和本周结束。 从第27周开始到第27周结束。
步骤3:使用这两个边界条件过滤结果集。
希望这可以帮助您解决问题。
答案 1 :(得分:3)
12-09 11:46:38.465:I / System.out(15130):临时日历设为12月9日 2012 19:29:59 GMT fdow(2)周(49),用户日历设置为2012年12月9日 格林威治标准时间14:51:59 fdow(2)周(50)
您的临时日历值与用户日历值之间差异将近5小时。
您正在使用GMT输出日期字符串:
temp.getTime()。toGMTString()
,而您的日历对象将使用本地时区。
temp.get(Calendar.WEEK_OF_YEAR)+&#34)
这些时间可能在格林尼治标准时间的同一天/周,但不在您当地的时区。
答案 2 :(得分:2)
这将为您提供自星期一星期一以来的日子
int daysSinceMonday = (7 + calendar.get(Calendar.DAY_OF_WEEK) - Calendar.MONDAY) % 7;
使用它来重新计算一周的开始。