我需要知道新旧系统时间之间的差异值(用户更改后)
使用以下代码,我会抓住用户更改时间的时刻:
<receiver android:name=".TimeChangeReceiver">
<intent-filter>
<action android:name="android.intent.action.TIME_SET"></action>
</intent-filter>
</receiver>
public class TimeChangeReceiver extends BroadcastReceiver {
private static final String TAG = TimeChangeReceiver.class.getSimpleName();
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "changed time: " + new Date(System.currentTimeMillis()));
}
}
Run Code Online (Sandbox Code Playgroud)
例如当前时间10:00,用户将其更改为11:00 - onReceive方法调用,但时间已经更改,如何获取以前的值 - 10:00?
您可以在下面找到计算先前值的解决方案.我试了一下你可以在这里找到我的实现 https://github.com/chrisport/setTimeIntent
主要的想法是:你需要一个独立的时间进行比较,我们可以采用 SystemClock.elapsedRealtime(),这是自设备启动以来的时间.现在我们可以计算这个elapsedTime和System.currentTimeMillis()之间的差异.除非SystemTime已更改(例如,由用户更改),否则此差异将始终保持不变.在这种情况下,我们可以计算新差异并比较它们以确定它已经改变了多少.
我们开始做吧:
计算当前差异:
public static long getCurrentDifference() {
long elapsedTime = SystemClock.elapsedRealtime();
long currentTime = System.currentTimeMillis();
return currentTime - elapsedTime;
}
Run Code Online (Sandbox Code Playgroud)将此差异存储在开始*到SharedPreferences
当接收到SET_TIME时,计算当前差异与存储的差异之间的差异
long lastDifference = mySharedPrefs.getLastTimeDifference();
//Calculate the new difference
long currentDifference = getCurrentDifference();
//Calculate the difference of the differences
//this is the change the user made
long userChangeInMillis = lastDifference - currentDifference;
//and here we get the old time:
long previousTime = System.currentTimeMillis() + userChangeInMillis;
Run Code Online (Sandbox Code Playgroud)你也可以用它来制作一个日期(新日期(previousTime)).
*要始终拥有初始时间差,您可以在应用程序打开时,设备启动时(需要另一个BroadCastReceiver)将其存储到SharedPreferences,以及在收到SET_TIME后保存新计算的差异.
编辑:
我的示例的输出如下所示:
Before it was Wed May 21 17:43:28 GMT+00:00 2014
Now it is: Wed May 21 18:43:00 GMT+00:00 2014
Run Code Online (Sandbox Code Playgroud)
不知何故,SET_TIME被收到两次.因此,有两个Log消息,第二个显示当前时间的两倍,因为我用新计算的一个覆盖lastDifference.
| 归档时间: |
|
| 查看次数: |
902 次 |
| 最近记录: |