我正在创建一个应用来提醒用户即将到来的约会。我们只说 用户预约时间为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;
}
任何人都可以帮助我吗?
答案 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 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() ;