【问题标题】:Issue with time differences in ms以毫秒为单位的时差问题
【发布时间】:2018-04-02 04:48:00
【问题描述】:

在我的应用程序中,我显示Notification 以及我的应用程序的上次打开日期

这是我获取上次打开时间的代码,

long time = 0;
if (MainPageActivity.SettingsInfo != null)
     time = System.currentTimeMillis() - MainPageActivity.SettingsInfo.getLong("LASTOPEN", 0);

并获得差异,

 String getTime(long ms)
    {
        final int SECOND = 1000;
        final int MINUTE = 60 * SECOND;
        final int HOUR = 60 * MINUTE;
        final int DAY = 24 * HOUR;
        String text;
        if (ms > DAY) {
            text=(ms / DAY)+(" Day(s) ago");
        }
        else
            text=(ms / HOUR)+(" Hour(s) ago");

        return text;
    }

它工作正常。但有时它会显示 0 小时前或一些不相关的日子,例如 1250 天前。

我确定 SettingsInfo 不为空,并且在此代码运行时具有上次打开的信息。

我在上面的代码中使用alarmnotification 会在超过 3 天时每天显示。

 SettingsInfo.edit().putLong("LASTOPEN", System.currentTimeMillis()).apply();

谁能解决这个问题?帮帮我!

【问题讨论】:

  • 不知道为什么你会得到那些1250 day(s) ago,但不是你当前的计算使用DateUtils#getRelativeTimeSpanString()方法之一
  • 我会试试的..谢谢

标签: android datetime


【解决方案1】:

试着抓住这个,

try
{ 
    SettingsInfo.edit().putLong("LASTOPEN", System.currentTimeMillis()).apply();
}
catch (Exception e) 
{
    // Device couldn't provide time :p 
}

没有 "{ }" 的 else 语句可以吗? (只是好奇)

【讨论】:

  • 在其他情况下,我显示“很久以前”。我的问题是_有时差异是错误的并且显示不相关的日子_。而SettingsInfo.edit().putLong("LASTOPEN", System.currentTimeMillis()).apply(); 不会抛出任何异常
  • 但是读错时间可能是它发生的唯一可能原因,尽管我知道的很少。 System.currentTimeMillis() 会抛出异常吗?
【解决方案2】:

您的代码运行良好,您将获得 0 小时前,因为您将 long 除以 int 并且如果您打开您的应用 自上次打开后 1 小时完成之前,您将始终获得 0 小时前。

此外,正如@pskink 所指出的那样 您可以使用DateUtils.getRelativeTimeSpanString 获得相对时间跨度:

String getTime(long lastOpen) {
    return DateUtils.getRelativeTimeSpanString(lastOpen, System.currentTimeMillis(), DateUtils.HOUR_IN_MILLIS).toString();
}

lastOpenMainPageActivity.SettingsInfo.getLong("LASTOPEN", 0)中存储的时间

【讨论】:

  • 它有效。我会告诉你它是否适用于特定的日子。但如果时间是 >24 和 >30*24,我需要 DateUtils.DAY_IN_MILLIS 和 DateUtils.DAY_IN_MILLIS。
  • 如果我使用 MINUTE_IN_MILLIS,我会在一小时后得到 1970 年 1 月 1 日
  • 确保你没有通过time = System.currentTimeMillis() - MainPageActivity.SettingsInfo.getLong("LASTOPEN", 0);你只需要通过lastOpen时间,而不是时差。
  • 然后不知何故它得到了 0 作为lastOpen
  • 我没听懂。最后一个参数是最小分辨率,因为DateUtils.MINUTE_IN_MILLIS 将给出结果最小值为 0 分钟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多