获取关闭应用程序的时间。怎么样?

时间:2019-09-24 17:13:22

标签: java android android-studio time

我想做一个空闲游戏,为此,我需要获取关闭应用程序的时间,以便我可以计算该离线时间的收入。

我的第一个想法是获取currentTimeMillis并通过sharedPreferences保存它们,当再次打开该应用程序时,我计算当前时间与保存时间之间的差。我的问题是sharedPreferences变量似乎一直都是0。

我的代码:

Zeit = System.currentTimeMillis() / 1000L;
Zeit_Differenz = Zeit - Zeit_SAVE;

        Log.i("e","aktuelle Zeit: " + Zeit);
        Log.i("e", "gespeicherte Zeit: " + Zeit_SAVE);
        Log.i("e", "errechnete differenz: " + Zeit_Differenz);
SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putLong("Zeit save", Zeit);
editor.apply();
SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
Zeit_SAVE = sharedPreferences.getLong("Zeit save", 0);

Logcat:

aktuelle Zeit: 1569344292                         (time right now)
gespeicherte Zeit: 0                              (saved time)
errechnete differenz: 1569344292                  (calculated difference)

这些摘录之间还有其他代码。我只是为您复制了最重要的代码。

希望您能为我提供帮助,这确实是我实现此目标的唯一想法。

3 个答案:

答案 0 :(得分:1)

tl; dr

由于我不使用Android,因此无法将值持久存储到存储中。但是我可以展示如何记录当前时刻并在以后计算经过的时间。

记录当前时刻。

Instant.now().toString()
  

"2019-09-24T20:50:52.827365Z"

解析该字符串,并捕获经过的时间:

Duration                                              // Represent a span-of-time not attached to the timeline.
.between(                                             // Calculate time elapsed between a pair of moments.
    Instant.parse( "2019-09-24T20:50:52.827365Z" ) ,  // Parse string in standard ISO 8601 format. The `Z` on the end means UTC, pronounced “Zulu”. 
    Instant.now()                                     // Capture the current moment in UTC.
)                                                     // Returns a `Duration` object. 
.toMillis()                                           // Interrogates the `Duration` object for its total elapsed time in milliseconds, effectively truncating any microseconds/nanoseconds.

java.time

现代的时间跟踪方法使用 java.time 类,具体是:

  • Instant代表UTC的时刻
  • Duration代表时间轴上未附加的时间跨度,基本上是纳秒级的计数。

使用UTC捕获当前时刻。

Instant instant = Instant.now() ;

使用标准ISO 8601格式坚持该值的文本表示形式。

String output = instant.toString() ;

读取该存储的字符串,并解析为Instant

String input = "2019-09-24T20:50:52.827365Z" ;
Instant then = Instant.parse( input ) ;

捕获当前时刻,并将经过的时间计算为“持续时间”。

Instant now = Instant.now() ;
Duration d = Duration.of( then , now ) ;

如果您希望经过的时间总计为毫秒,请询问Duration对象。

long milliseconds = d.toMillis() ;  // Total elapsed time in milliseconds, truncating any microseconds/nanoseconds. 

关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

答案 1 :(得分:1)

只需重写方法Activity.onPause()Activity.onResume(),以保存时间戳,然后再执行计算。首选项名称Zeit save中的一个空格可能导致其始终返回默认值0;最好用_下划线代替,例如。 timestamp_paused

答案 2 :(得分:0)

尝试这篇文章 https://www.javatpoint.com/java-get-current-date

获取当前日期并在下次加载时从日期中减去-跨实例保存在文件中