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

标签 java android date calendar android-alarms

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

我希望有人能指出我错过的东西?

编辑

我通过用户界面中的按钮调用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/

相关文章:

javascript - 如何按 Angular 从本地存储中按日期键删除日期

java - Castor:如何映射 Java 层次结构

android - pom.xml 中的 Maven 依赖错误

java - 在Java中压缩/解压缩LZMA字符串

Android:更正 MIME 类型以在 SAF 中选择 ttf 字体

与完整版具有相同代码库的 Android 试用程序

java - 从 DatePickerDialog 设置日期的好习惯?

date - elm 0.19.1 中的当前年份为 4 位数字

java - 将变量值存储在数组中以查找平均速度

Java 8 流 : conditional Collector