如何将存储的日期和时间与 SimpleDateFormat 进行比较并显示通知?

How to compare stored date and time with SimpleDateFormat and display notification?

在我的应用程序中,我想根据用户已经设置的时间显示通知,并且我将日期和时间存储到本地数据库中。
我正在从本地数据库获取日期和时间,并与 SimpleDateFormat 进行比较,并像这样 Date 进行解析

SimpleDateFormat yourDateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm");
Date date = null;
     try { 
          String date_time = "17-11-2017 15:10";
          date = yourDateFormat.parse(date_time);

     } catch (ParseException e) {
          Log.e(TAG, "Parsing date time failed", e);
     }
     Calendar calendar = Calendar.getInstance();
     calendar.setTime(date);

     Calendar current = Calendar.getInstance();
     if (calendar.compareTo(current) <= 0) {

        Toast.makeText(getApplicationContext(), "Invalid Date/Time", Toast.LENGTH_LONG).show();
     } else {
          AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
          Intent myIntent = new Intent(RemainderActivity.this, NotificationReceiver.class);             
          PendingIntent displayIntent = PendingIntent.getBroadcast(getBaseContext(), 0, myIntent, 0);
          alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), displayIntent);

    }


某些设备它在 7.0 android 版本以上工作正常,但在 7.0 版本以下它显示 java.lang.NullPointerException 像这样

 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.Date java.text.SimpleDateFormat.parse(java.lang.String)' on a null object reference


错误显示在这里 date = yourDateFormat.parse(date_time);.

请帮帮我。
提前致谢。

好的,问题已更改,这是您的新解决方案:

在此之前:

Calendar calendar = Calendar.getInstance();
     calendar.setTime(date);

添加:

Locale locale = new Locale("en","US")

然后替换:

Calendar calendar = Calendar.getInstance();

与:

Calendar calendar = Calendar.getInstance(locale);

看起来像这样:

Locale locale = new Locale("en","US")
Calendar calendar = Calendar.getInstance(locale);
calendar.setTime(date);

您提供的整个代码如下:

SimpleDateFormat yourDateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm");
Date date = null;
 try { 
      String date_time = "17-11-2017 15:10";
      date = yourDateFormat.parse(date_time);

 } catch (ParseException e) {
      Log.e(TAG, "Parsing date time failed", e);
 }
 Locale locale = new Locale("en","US")
 Calendar calendar = Calendar.getInstance(locale);
 calendar.setTime(date);

 Calendar current = Calendar.getInstance();
 if (calendar.compareTo(current) <= 0) {

    Toast.makeText(getApplicationContext(), "Invalid Date/Time", Toast.LENGTH_LONG).show();
 } else {
      AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
      Intent myIntent = new Intent(RemainderActivity.this, NotificationReceiver.class);             
      PendingIntent displayIntent = PendingIntent.getBroadcast(getBaseContext(), 0, myIntent, 0);
      alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), displayIntent);

}

要获取用户选择的日期,您可以使用它,

private void getSelectedDate() {
        String myFormat = "dd/MM/yyyy";
        SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
        String new_date = sdf.format(cal.getTime());
        System.out.println("DATE SELECTED IS ::    " + new_date);
        your_textview.setText(new_date);
    }

代码很多,几行代码就可以设置闹钟。您需要做的是获取毫秒 DatePicker 或其他 API 的日期,并将您的 AlarmManager 配置为在该时间到期时触发。像这样:

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
          Intent myIntent = new Intent(RemainderActivity.this, NotificationReceiver.class);             
          PendingIntent displayIntent = PendingIntent.getBroadcast(getBaseContext(), 0, myIntent, 0);
          alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
        SystemClock.elapsedRealtime() +
        60000, alarmIntent);

以上代码将每 1 分钟(60000 毫秒)触发一次 BroadcastReceiver。只需将时间替换为用户设置的日期即可。