您可以利用
DateFormat
类解析
yyyy-mm-dd HH:mm:ss
格式的日期,比如
SimpleDateFormat类。这个操作会返回一个
Date
对象。
您也可以根据当前时间的毫秒数创建一个
Date
对象。
当您有这两个对象后,您可以使用
compareTo
方法进行比较。
例如以下代码:
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date parsed = sdf.parse("2016-03-10 22:05:20");
Date now = new Date(System.currentTimeMillis());
System.out.println(parsed.compareTo(now));
} catch (Exception e) {
e.printStackTrace();
}
将会打印-1
,这意味着parsed
在now
之前。
编辑:
下面是一个简单但无用的应用程序的代码,它使用了AlarmManager。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d("TAG", "From intent: "+getIntent().getStringExtra("MyEXTRA"));
}
@Override
protected void onResume() {
super.onResume();
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long parsedMillis = sdf.parse("2016-03-10 22:54:30").getTime();
long now = System.currentTimeMillis();
if (parsedMillis > now) {
Log.d("TAG", "In the future!");
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent intent = new Intent(this, MyActivity.class);
intent.putExtra("MyEXTRA", "From alarm");
PendingIntent broadcast = PendingIntent.getActivity(this, 0, intent, 0);
am.setExact(AlarmManager.RTC_WAKEUP, parsedMillis, broadcast);
} else {
Log.d("TAG", "In the past...");
}
} catch (Exception e) {
e.printStackTrace();
}
}
在LogCat中,您将看到:
03-10 22:54:20.925 3946-3946/com.example.myapp D/TAG﹕ From intent: null
03-10 22:54:21.227 3946-3946/com.example.myapp D/TAG﹕ In the future!
03-10 22:54:30.513 3946-3946/com.example.myapp D/TAG﹕ From intent: From alarm
03-10 22:54:30.577 3946-3946/com.example.myapp D/TAG﹕ In the past...
最后一行被打印是因为闹钟导致活动重新启动,因此
onResume
将再次被调用,并且
System.currentTimeMillis()
将大于硬编码时间。但是,正如您所看到的,闹钟在预定时间正确触发。
此外,您应该考虑边缘情况:如果
parsedMillis
仅比
now
多几毫秒,您可能会设置一个永远不会被触发的闹钟,因为它是在过去设置的。这是因为操作系统需要一些时间来执行您的代码,因此您应该检查
parsedMillis > now + DELTA
,其中
DELTA
是取决于您在
System.currentTimeMillis()
和
am.setExact(...)
之间执行的代码的合理时间量。