Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 每天只更新一次_Android_Date - Fatal编程技术网

Android 每天只更新一次

Android 每天只更新一次,android,date,Android,Date,我的Android应用程序中有些东西需要每天更新一次 我认为这很简单,但我不知道我需要什么格式来设置日期和时间(如果需要时间)以及如何检查今天是否完成了更新(今天是用户当地时间的00:01到23:59之间)。如果今天已完成更新,则不应进行更新 以下是我所知道的方法: 将上次更新日期保存在SharedReferences中(但是如何获取更新日期 一串,我不知道) 从SharedReferences获取内容(但我 不知道如何比较字符串格式的日期) 如果以20121122(YYYYmmdd)格式存储

我的Android应用程序中有些东西需要每天更新一次

我认为这很简单,但我不知道我需要什么格式来设置日期和时间(如果需要时间)以及如何检查今天是否完成了更新(今天是用户当地时间的00:01到23:59之间)。如果今天已完成更新,则不应进行更新

以下是我所知道的方法:

  • 将上次更新日期保存在SharedReferences中(但是如何获取更新日期 一串,我不知道)
  • 从SharedReferences获取内容(但我 不知道如何比较字符串格式的日期)

如果以20121122(YYYYmmdd)格式存储日期,则可以将其与20121122>20121123进行比较。但在比较时,它必须存储为int或强制转换为int。

如果以格式20121122(YYYYmmdd)存储日期,则可以进行类似20121122>20121123的比较。但在比较时必须将其存储为int或强制转换为int。

存储上次执行的时间戳(System.currentTimeMillis()),并将其与当前执行的时间戳进行比较。如果差异超过24小时。。。您知道它还是?

存储上次执行的时间戳(System.currentTimeMillis()),并将其与当前执行的时间戳进行比较。如果差异超过24小时。。。你知道吗?

你选择什么格式无关紧要。这只是重新计算的问题

我建议使用epoch之后的毫秒,因为所有系统调用都使用它,所以使用相同的时间会更容易

由于1000毫秒是1秒,很容易计算出
1000*60*60*24
等于一天(24小时)。因此,如果
storedMillis
大于
NOW-1000*60*60*24
,(并且
NOW
就是
System.currentTimeMillis()
),那么现在进行检查还为时过早。如果
storedMillis
较小,则立即保存
时间戳并进行检查:

long now = System.currentTimeMillis();
long diffMillis = now - lastCheckedMillis;
if( diffMillis >= (3600000  * 24) ) {
  // store now (i.e. in shared prefs)

  // do the check
} else {
   // too early
}
编辑

我很有兴趣在应用程序第一次打开时做这件事 当前日期,即使上次更新是在10分钟前完成的

问题在于如何获得合适的毫度来进行比较。替换
long now=System.currentTimeMillis()来自上述代码,代码块如下:

Calendar cal = Calendar.getInstance();
cal.clear(Calendar.HOUR);
cal.clear(Calendar.HOUR_OF_DAY);
cal.clear(Calendar.MINUTE);
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MILLISECOND);

long now = cal.getTimeInMillis();

你选择什么格式无关紧要。这只是重新计算的问题

我建议使用epoch之后的毫秒,因为所有系统调用都使用它,所以使用相同的时间会更容易

由于1000毫秒是1秒,很容易计算出
1000*60*60*24
等于一天(24小时)。因此,如果
storedMillis
大于
NOW-1000*60*60*24
,(并且
NOW
就是
System.currentTimeMillis()
),那么现在进行检查还为时过早。如果
storedMillis
较小,则立即保存
时间戳并进行检查:

long now = System.currentTimeMillis();
long diffMillis = now - lastCheckedMillis;
if( diffMillis >= (3600000  * 24) ) {
  // store now (i.e. in shared prefs)

  // do the check
} else {
   // too early
}
编辑

我很有兴趣在应用程序第一次打开时做这件事 当前日期,即使上次更新是在10分钟前完成的

问题在于如何获得合适的毫度来进行比较。替换
long now=System.currentTimeMillis()来自上述代码,代码块如下:

Calendar cal = Calendar.getInstance();
cal.clear(Calendar.HOUR);
cal.clear(Calendar.HOUR_OF_DAY);
cal.clear(Calendar.MINUTE);
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MILLISECOND);

long now = cal.getTimeInMillis();

这就足够了。

用AlarmManager设置一个每24小时执行一次的警报,然后做一些事情

检查此问题:


这是一种比其他方法更复杂的方法,但要确保事情完成,而使用其他选项时,必须执行应用程序,以检查是否需要更新任何内容。

使用AlarmManager设置一个每24小时执行一次的警报,然后执行其他操作

检查此问题:

这是一种比其他方法更复杂的方法,但要确保事情都完成了,而使用其他选项时,必须执行应用程序,以检查是否需要更新任何内容。

以下是方法

public boolean runOnceADay() {
    SharedPreferences shp= c.getSharedPreferences(Constants.GENERAL_SHP, MODE_PRIVATE);
    SharedPreferences.Editor editor= shp.edit();
    long lastCheckedMillis = shp.getLong(Constants.ONCE_A_DAY, 0); // "KEY" you may change yhe value
    long now = System.currentTimeMillis();
    long diffMillis = now - lastCheckedMillis;
    if (diffMillis >= (3600000 * 24)) { // set up your time circulation
         editor.putLong(Constants.ONCE_A_DAY, now);
        editor.commit();
        Util.showMessage(c, "Once a Day Test");
        return false;
     } else {
        Util.showMessage(c, "Too Early");
        return true;
    }
}
这里是方法

public boolean runOnceADay() {
    SharedPreferences shp= c.getSharedPreferences(Constants.GENERAL_SHP, MODE_PRIVATE);
    SharedPreferences.Editor editor= shp.edit();
    long lastCheckedMillis = shp.getLong(Constants.ONCE_A_DAY, 0); // "KEY" you may change yhe value
    long now = System.currentTimeMillis();
    long diffMillis = now - lastCheckedMillis;
    if (diffMillis >= (3600000 * 24)) { // set up your time circulation
         editor.putLong(Constants.ONCE_A_DAY, now);
        editor.commit();
        Util.showMessage(c, "Once a Day Test");
        return false;
     } else {
        Util.showMessage(c, "Too Early");
        return true;
    }
}

虽然这是一个很好的答案,但我认为你把我的问题搞错了。如果最后一次更新时间超过24小时,我对更新不感兴趣。我感兴趣的是在应用程序当天第一次打开时进行更新,即使最后一次更新是在10分钟前完成的。想象一下:最后一次更新是在1月4日23:55完成的。我在1月5日00:05再次打开应用程序。使用您的代码,更新不会在应该运行时运行。我将不得不再等待23个多小时,然后重新打开应用程序以激活更新,结果是一天没有更新。虽然这是一个很好的答案,但我认为你误解了我的问题。如果最后一次更新时间超过24小时,我对更新不感兴趣。我感兴趣的是在应用程序当天第一次打开时进行更新,即使最后一次更新是在10分钟前完成的。想象一下:最后一次更新是在1月4日23:55完成的。我在1月5日00:05再次打开应用程序。使用您的代码,更新不会在应该运行时运行。我将不得不再等待23个多小时,然后重新打开应用程序以激活更新,这将导致一天没有更新。我已经对@WebnetMobile.com的回答发表了评论,解释了为什么这种方法不适合我的情况。然后接受他的答案并搜索偏好示例,工作在以下线程中完成:)我已经对@WebnetMobile.com的答案发表了评论,解释了为什么这种方法不适合我的情况。然后接受他的答案并搜索一个偏好设置示例,该任务在以下线程中完成:)请参阅我对@WebnetMobile.com答案的评论。这种方法不合适,因为如果应用程序在前一天23:59左右更新,那么我就有几天没有更新。请参阅我对@WebnetMobile.com答案的评论。这种方法不合适,因为如果应用程序在前一天23:59左右更新,那么我就有几天没有更新。你的答案回答了这个问题。如果其他人不来,我一定会来接你