我发现一个教程可以帮助我设置有效的闹钟,但在教程中我们使用日期选择器来设置闹钟时间。一切都很顺利,所以我尝试用我自己的方法替换日期选择器,并以这种方式设置闹钟。问题是它似乎不起作用,当我将日期设置为今天时不会弹出警报,但当我使用日期选择器时工作正常。谁能告诉我我做错了什么?我通过调试运行了这个,我的查询返回了正确的日期,我得到了正确的数字等等,但它似乎不起作用。
我希望有人能指出我错过的东西?
编辑
我通过用户界面中的按钮调用setNotif()
。我基本上将其改造为只有一个用于测试的按钮。我得到了 toast ,但无论我怎么努力,警报都没有响起。
这是原始日期选择器代码
public void onDateSelectedButtonClick(View v){
int day = picker.getDayOfMonth();
int month = picker.getMonth();
int year = picker.getYear();
Calendar c = Calendar.getInstance();
c.set(year, month, day);
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
scheduleClient.setAlarmForNotification(c);
Toast.makeText(this, "Notification set for: "+ day +"/"+ (month+1) +"/"+ year, Toast.LENGTH_SHORT).show();
}
这是我尝试替换它的方法
它调用查询以从我的数据库中获取特定日期,并据称在 3 天前设置闹钟。我通过更改手机日期并将闹钟设置为今天来进行测试,但两者都不起作用。
public void setNotif() {
// Getting the next date of payments which the alarm will be based on
DatabaseHelper db = new DatabaseHelper(this);
String thisdate = getCurDate();
Cursor cur = db.nextdate(thisdate);
String date= "";
if (cur!= null) {
if (cur.moveToFirst()) {
date = cur.getString(0);
}
}
try {
DateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd");
Date input = inputFormat.parse(date);
String finaldate = inputFormat.format(input);
String d = finaldate.substring(8,10);
String m = finaldate.substring(5,7);
String y = finaldate.substring(0,4);
int da = Integer.parseInt(d);
int month = Integer.parseInt(m);
int year = Integer.parseInt(y);
int day = da - 3;
Calendar c = Calendar.getInstance();
c.set(year, month, day);
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
scheduleClient.setAlarmForNotification(c);
Toast.makeText(this, "Notification set for: "+ day +"/"+ month +"/"+ year, Toast.LENGTH_SHORT).show();
}catch (Exception ex) {
Alerts.CatchError(Kik.this, ex.toString());
}
}
最佳答案
不幸的是,这是一个很容易遇到的障碍,而且它与 Android 没有任何关系。它是 Java 日期/日历的延续。
当您从示例代码中的日期选择器中提取 int Month
中的日期时,您得到的值是基于 0 的:
int month = picker.getMonth();
// January -> 0
// February -> 1
// ...
// December -> 11
数据库中的日期是我们习惯查看的日期:2016-12-25
是 2016 年 12 月 25 日。
当您设置Calendar
的值时,它预计是一个索引为 0 的月份。您给它一个索引为 1 的月份。因此,您需要从月份中减去 1 才能获得正确的值。我将制作一个表格,以便清楚地了解发生了什么:
Month String | Database Value | Calendar Value
January | 1 | 0
February | 2 | 1
March | 3 | 2
April | 4 | 3
May | 5 | 4
June | 6 | 5
希望这能让这一点显而易见。
因此,在您的情况下,如果您更改行:
c.set(year, month, day);
成为...
c.set(year, month - 1, day);
你会赢。
关于java - 根据数据库中的日期设置警报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30031679/