【发布时间】:2014-03-14 03:15:44
【问题描述】:
我有一个游戏客户端 Google App Engine 服务器。我的服务器向客户端发送了一个 UTC 时间日期字符串,该字符串是自纪元以来的毫秒数,表示上次播放的日期戳。我希望我的客户报告自上次播放以来的天数/小时/分钟。我在我的 iOS 客户端中有这个工作,但无法让它在 Android 中工作。我尝试了很多选项,一些使用Joda-Time 一些纯 Java 的 Date 对象,时间总是偏移几个小时。奇怪的是时间不在整点时间.. 可能是 2 小时 34 分钟.. 所以我不认为我的问题只是时区问题,或者它会在整点时间不?
基本上我需要获取这个 UTC 时间,然后也获取 UTC 中的当前时间。比较差异以获得天/小时/分钟
这就是我所拥有的,我正在使用Joda-Time 库:
例如,我的服务器向我发送了这个字符串“1392392591.0”(恰好是太平洋标准时间上午 7:45 左右的 UTC 时间)
public String convertDateString ( String date ) {
Float gameEpoch = Float.parseFloat( date );
DateTime now = new DateTime();
DateTime gameTime = new DateTime(gameEpoch.longValue() * 1000 );
Period p = new Period(gameTime, now, PeriodType.dayTime());
String dateString = "";
if(p.getDays() > 0)
dateString = (p.getDays() + " days " + p.getHours() + " hours ago");
else if(p.getHours() > 0)
dateString = (p.getHours() + " hours " + p.getMinutes() + " minutes ago");
else if(p.getMinutes() > 0)
dateString = (p.getMinutes() + " minutes ago");
else
dateString = "Just Now";
return dateString;
}
【问题讨论】:
-
My server sends the client a UTC timedate string which is milliseconds since epoch。没有。自 Unix [epoch][1] 以来,您的客户端正在接收 秒,而不是 毫秒。显然你知道这一点,而且一定是打错了,因为你的示例代码正确地乘以 1000。我正在为其他读者做这个笔记。 -
我建议将
L添加到1000以成为1000L。在使用“long”原始类型进行数学运算以避免数据丢失时,这是一个好习惯。添加L还有助于使代码自记录,提醒我们处理的是长整数而不是更常见的整数。 -
会的,谢谢 Basil
标签: java android google-app-engine datetime jodatime