我想做一个空闲游戏,为此,我需要获取关闭应用程序的时间,以便我可以计算该离线时间的收入。
我的第一个想法是获取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)
这些摘录之间还有其他代码。我只是为您复制了最重要的代码。
希望您能为我提供帮助,这确实是我实现此目标的唯一想法。
答案 0 :(得分:1)
由于我不使用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 类,具体是:
使用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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
目前位于Joda-Time的maintenance 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
获取当前日期并在下次加载时从日期中减去-跨实例保存在文件中