Java 根据数据库中的日期设置报警

Java 根据数据库中的日期设置报警,java,android,date,calendar,android-alarms,Java,Android,Date,Calendar,Android Alarms,我找到了一个教程,帮助我得到一个工作警报设置,但在教程中,我们使用了日期选择器来设置警报的时间。一切进展顺利,所以我尝试用我自己的方法来代替日期选择器,并以此方式设置闹钟。问题是它似乎不起作用,当我将日期设置为今天时,不会弹出警报,但当我使用日期选择器时,它工作正常。谁能告诉我我做错了什么?我通过调试运行了这个,我的查询返回了正确的日期,我得到了正确的数字,但它似乎不起作用 我希望有人能指出我遗漏了什么 编辑 我通过ui中的按钮调用setNotif()。我基本上对它进行了改造,只需一个按钮即可进

我找到了一个教程,帮助我得到一个工作警报设置,但在教程中,我们使用了日期选择器来设置警报的时间。一切进展顺利,所以我尝试用我自己的方法来代替日期选择器,并以此方式设置闹钟。问题是它似乎不起作用,当我将日期设置为今天时,不会弹出警报,但当我使用日期选择器时,它工作正常。谁能告诉我我做错了什么?我通过调试运行了这个,我的查询返回了正确的日期,我得到了正确的数字,但它似乎不起作用

我希望有人能指出我遗漏了什么

编辑

我通过ui中的按钮调用
setNotif()
。我基本上对它进行了改造,只需一个按钮即可进行测试。我得到了祝酒词,但不管我怎么做都没有闹钟响

这是原始日期选择器代码

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日

当您设置
日历
的值时,应为0索引月份。你给它一个月的时间。因此,您需要从月份中减去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);

你会赢。

你在哪里调用这个方法
setNotif()
?将其置于按钮回调中会强制UI线程上的操作。有没有可能你在一个背景线程中,所以祝酒词不是在祝酒?哦,忘了提这个了。我会把它编辑一下,谢谢。你的数据库里的日期是什么样的?你确定它是YYYY-MM-dd格式的吗?您转换为日历的方法似乎有点奇怪。你在LogCat中有什么发现吗?很抱歉,这是我第一次处理日历,我只是想把我知道的补充到现有的部分中。是的,我确定日期,我已经通过调试模式运行了它,并且以正确的格式得到了预期的日期。logcat上也没有任何内容,我在最后得到了
吐司
,但警报从未响过。我想你想从中减去一个月。。。所以您希望您的月份行类似于:
intmonth=Integer.parseInt(m)-1
我明白了,所以当使用
日历时,在月份中添加1只是为了表示人类日期,而从人类日期到
日历
日期自然正好相反。非常感谢你的澄清。干杯