借助DateFormat 类(例如SimpleDateFormat 类),您可以解析yyyy-mm-dd HH:mm:ss 日期。此操作将返回一个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()); // 2016-03-10 22:06:10
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(); // 22:54:15
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(...) 之间执行的代码。