区分新旧时间

时间:2014-05-21 14:12:40

标签: 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()));
    }
}

例如当前时间10:00,用户将其更改为11:00 - onReceive方法调用,但时间已经更改,如何获取以前的值 - 10:00?

3 个答案:

答案 0 :(得分: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;
    }
    
  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;
    
  4. 你也可以用它制作一个日期(新日期(上一个时间))。

    *要始终拥有初始时差,您可以在应用程序打开时,设备启动时(需要另一个BroadCastReceiver)将其存储到SharedPreferences,以及在收到SET_TIME后保存新计算的差异。< / p>

    编辑:

    我的示例的输出如下所示:

    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
    

    以某种方式接收SET_TIME两次。因此,有两个Log消息,第二个显示当前时间的两倍,因为我用新计算的一个覆盖lastDifference。

答案 1 :(得分:1)

据我所知,唯一的方法是在调用接收器之前保存它。在应用程序启动时,例如:

public class MainActivity extends Activity {
    ...
    @Override 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        mReferenceTime = System.currentTimeMillis();
    }
 ...
 }

根据您所需的准确度,您可能需要更频繁地更新此参考时间,例如使用后台任务(请注意电池!):

// at application startup:
mClkRef = new Thread() {
    @Override
    public void run() {
        while (hasToRun()) {
            mReferenceTime = System.currentTimeMillis();
            sleep(A_REASONABLE_WHILE);
        }
    }

    ...
};

mClkRef.start();

在这种情况下,您必须从TimeChangeReceiver.onReceive()控制或处置/重新创建此线程。

根据您的操作/应用的工作方式,Handler.postDelayed()也可能是一个有趣的解决方案。

答案 2 :(得分:0)

Chrisport,

我修复了&#34;不知怎的,SET_TIME被收到两次。因此,有两个Log消息,第二个显示当前时间的两倍,因为我用新计算的一个&#34;覆盖lastDifference。你在说什么

基本上,如果mySharedPrefs.getLastTimeDifference()等于-1,则不记录差异。

我得到的第一个日志的日期是1969年,所以我添加了一个if语句然后修复了。