需要在Java中转换UTC日期字符串的帮助吗

需要在Java中转换UTC日期字符串的帮助吗,java,android,google-app-engine,datetime,jodatime,Java,Android,Google App Engine,Datetime,Jodatime,我有一个游戏客户端和一个服务器。我的服务器向客户端发送一个timedate字符串,该字符串是从表示上次播放的日期戳的历元开始的毫秒数。我希望我的客户报告自上次播放以来的天数/小时/分钟。我在我的iOS客户端上可以使用它,但在Android上无法使用它。我尝试了很多选择,有些使用了一些纯Java的日期对象,时间总是被几个小时抵消。奇怪的是时间不在正点。。可以休息2小时34分钟。。所以我不认为我的问题只是一个时区的问题,或者它会在时间上不 基本上,我需要得到这个UTC时间,然后再得到当前UTC时间。

我有一个游戏客户端和一个服务器。我的服务器向客户端发送一个timedate字符串,该字符串是从表示上次播放的日期戳的历元开始的毫秒数。我希望我的客户报告自上次播放以来的天数/小时/分钟。我在我的iOS客户端上可以使用它,但在Android上无法使用它。我尝试了很多选择,有些使用了一些纯Java的日期对象,时间总是被几个小时抵消。奇怪的是时间不在正点。。可以休息2小时34分钟。。所以我不认为我的问题只是一个时区的问题,或者它会在时间上不

基本上,我需要得到这个UTC时间,然后再得到当前UTC时间。。比较差异以获得天/小时/分钟

这是我所拥有的,我正在使用图书馆:

例如,我的服务器向我发送字符串“1392392591.0”(恰好是utc时间,大约为太平洋标准时间上午7:45)


不要将
字符串
转换为
浮点
。浮点数只有7位有效数字,因此
gameEpoch
总是不精确的。使用
double
,或者更好的是,使用
long

是正确的

顺便说一下,在示例代码的后半部分中,您工作得太辛苦了。提供一个类来帮助您生成这些描述性字符串

这个示例代码需要一些技巧,但会让您朝着正确的方向前进

// Period(int years, int months, int weeks, int days, int hours, int minutes, int seconds, int millis)
Period period = new Period( 0, 0, 0, 2, 3, 4, 0, 0 );

PeriodFormatter formatter = new PeriodFormatterBuilder()
        .printZeroAlways()
        .appendYears()
        .appendSuffix( " year", " years" )
        .appendSeparator( ", " )
        .printZeroRarelyLast()
        .appendMonths()
        .appendSuffix( " month", " months" )
        .appendSeparator( ", " )
        .appendWeeks()
        .appendSuffix( " week", " weeks" )
        .appendSeparator( ", " )
        .appendDays()
        .appendSuffix( " day", " days" )
        .appendSeparator( ", " )
        .appendHours()
        .appendSuffix( " hour", " hours" )
        .appendSeparator( ", and " )
        .appendMinutes()
        .appendSuffix( " minute", " minutes" )
        .toFormatter();

String timeSpanDescription = formatter.print( period );
转储到控制台

System.out.println( "period: " + period );
System.out.println( "timeSpanDescription: " + timeSpanDescription );
当运行时

周期:P2DT3H4M
时间描述:0年2天3小时4分钟

我已经调整了我的代码,但仍然比我预期看到的相差2小时2分钟(我有一个javascript和objectiveC客户端在做同样的事情,它们正在工作)。这里有一个更新,我将其转换为Long:
Long gameEpoch=Long.parseLong(date)有趣的是。。如果我只检查UTC中的“现在”时间,它会从我的笔记本电脑时钟上消失几个小时,这是意料之中的,但它也会消失2分钟,这是我没有预料到的。当我将本地时间转换为UTC时,我是否应该期待不仅仅是天数和小时数的变化。。最小值也会改变吗?我不会想到soAH!找到了我被扔的地方。我在android模拟器中运行这个。。结果是模拟器的时钟关闭了2分钟,时区设置为格林尼治标准时间。这让我很恼火。我认为上面的代码经过长时间的调整是有效的。谢谢你的帮助。。我觉得自己很笨。
我的服务器向客户端发送一个UTC timedate字符串,该字符串是从epoch开始的毫秒。
。不。您的客户端从Unix[epoch][1]开始接收秒数,而不是毫秒数。显然,您知道这一点,并且一定输入错误,因为您的示例代码正确地乘以了1000。我为其他读者做了这个注释。我建议在
1000
的基础上添加一个
L
,成为
1000L
。在使用“long”原语类型进行计算时,这是一个好习惯,以避免数据丢失。添加一个
L
也有助于使代码自我记录,提醒我们处理的是long而不是更常见的int。这样就可以了,感谢basiltanks提供的示例!自从发布这篇文章以来,我已经改进了我所拥有的。。但我没有利用PeriodFormatterBuilder。
System.out.println( "period: " + period );
System.out.println( "timeSpanDescription: " + timeSpanDescription );