区分新旧时间

Sin*_*ami 4 android

我需要知道新旧系统时间之间的差异值(用户更改后)

使用以下代码,我会抓住用户更改时间的时刻:

<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?

Chr*_*ort 9

您可以在下面找到计算先前值的解决方案.我试了一下你可以在这里找到我的实现 https://github.com/chrisport/setTimeIntent

主要的想法是:你需要一个独立的时间进行比较,我们可以采用 SystemClock.elapsedRealtime(),这是自设备启动以来的时间.现在我们可以计算这个elapsedTime和System.currentTimeMillis()之间的差异.除非SystemTime已更改(例如,由用户更改),否则此差异将始终保持不变.在这种情况下,我们可以计算新差异并比较它们以确定它已经改变了多少.

我们开始做吧:

  1. 计算当前差异:

    public static long getCurrentDifference() {
      long elapsedTime = SystemClock.elapsedRealtime();
      long currentTime = System.currentTimeMillis();
      return currentTime - elapsedTime;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将此差异存储在开始*到SharedPreferences

  3. 当接收到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.