确定安排警报的日期和时间

时间:2016-09-17 06:39:20

标签: java android

我正在创建一个应用来提醒用户即将到来的约会。我们只说 用户预约时间为21:9:2016。因此,在被任命两天之前,警报将开始通知他 目前我知道如何在特定时间设置闹钟,但不知道如何设置从1日期到另一个日期的闹钟。 这是我为特定日期设置警报的代码。

  public static void setUpAlarm(Context context, String time, String appointment_id) {

    int month = Integer.valueOf(DataBaseManager.getInstance(context).getMonthFromDateTime(time));
    int year = Integer.valueOf(DataBaseManager.getInstance(context).getYearFromDateTime(time));
    int day = Integer.valueOf(DataBaseManager.getInstance(context).getDayofTheMonth(time));
    int hour = Integer.valueOf(DataBaseManager.getInstance(context).getHourFromDateTime(time));
    int min = Integer.valueOf(DataBaseManager.getInstance(context).getMinuteFromDateTime(time));
        int sec =0;
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.clear();
        calendar.set(year, --month, day, hour, min, 0);
        long sdl = calendar.getTimeInMillis();



        AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, AlarmReciver.class);
        intent.putExtra("service_id", appointment_id);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, Integer.valueOf(alarmCode), intent, PendingIntent.FLAG_CANCEL_CURRENT);
        alarmMgr.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
    }

// db函数用于从日期时间获取日,小时,月,年

    public String getDayofTheMonth(String datetime) {
    db = this.DataBase.getReadableDatabase();


    String selectQuery = "select strftime('%d','" + datetime + "') as result";
    Cursor c = db.rawQuery(selectQuery, null);
    if (c.moveToFirst()) {
        return c.getString(c.getColumnIndex("result"));
    }
    return "";
}


public String getSecondFromDateTime(String datetime) {
    db = this.DataBase.getReadableDatabase();


    String selectQuery = "select strftime('%S','" + datetime + "') as result";
    Cursor c = db.rawQuery(selectQuery, null);
    if (c.moveToFirst()) {
        return c.getString(c.getColumnIndex("result"));
    }
    return "";
}

public String getMinuteFromDateTime(String datetime) {
    db = this.DataBase.getReadableDatabase();


    String selectQuery = "select strftime('%M','" + datetime + "') as result";
    Cursor c = db.rawQuery(selectQuery, null);
    if (c.moveToFirst()) {
        return c.getString(c.getColumnIndex("result"));
    }
    return "";
}

用于根据未来日期确定过去日期的功能

public List<String> getPastDatesFromSpecificDate(String noOfDays, String datetime) {
    db = this.Database.getReadableDatabase();
    List<String> dateslist = new ArrayList<>();
    for (int i = -1; i < Integer.valueOf(datetime); i++) {
        String selectQuery = "SELECT date('" + datetime + "','-" + i + " day') as datetime; ";
        Cursor c = db.rawQuery(selectQuery, null);
        if (c.moveToFirst()) {
            Log.d("past_dates",c.getString(c.getColumnIndex("datetime")));
            dateslist.add(c.getString(c.getColumnIndex("datetime")));
        }
    }

    return dateslist;
}

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

您可以像这样获得上一个日期。

private String getYesterdayDateString() {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -1);
        return dateFormat.format(cal.getTime());
    }

答案 1 :(得分:0)

问题

听起来您想要在每天的同一时间设置定期闹钟。要设置闹钟,您显然需要自UTC 1970年开始时代以来的毫秒数。

如果你的问题不是这个,你应该编辑问题以获得进一步的信息,因为它没有写清楚。

java.time

您正在使用麻烦的旧的旧日期时间类,这些类现在已经过时了java.time类。大部分java.time功能都被反向移植到Java 6&amp; ThreeTen-Backport项目中的7,并在ThreeTenABP项目中进一步适应Android。

使用LocalTime类来表示每天的闹钟时间。

LocalTime alarmTime = LocalTime.of( 6 , 0 , 0 );

获取当前日期。所需的时区因为日期在全球范围内不同。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

为明天设置闹钟。

LocalDate tomorrow = today.plusDays( 1 );

将这三个部分组合在一起以创建一个ZonedDateTime对象来表示时间轴上的特定时刻。

ZonedDateTime zdt = 
    ZonedDateTime.of( tomorrow , alarmTime , z );

提取自纪元以来的毫秒数。我们可以从Instant得到这个,在UTC时间轴上的一个时刻,分辨率为纳秒。

long millisecondsSinceEpoch = 
    zdt.toInstant()
       .toEpochMilli() ;