【发布时间】:2017-01-19 09:32:48
【问题描述】:
在我的应用程序中,我从 web 服务中检索了一个 unix 时间戳(未来 0 到 15 分钟之间),并以 XXm-XXs 的形式显示该时间的倒计时。
所以我只是做System.currentTimeMillis() - timestamp 并将结果转换为人类可读的日期。
一切正常,但似乎在某些时区,我的计时器关闭了 30 分钟,因为 ,因为日历在我请求分钟时返回错误的分钟值.
时区是吉隆坡(马来西亚)的 GMT+8。使用另一个 GMT+8 时区可以正常工作。
示例:System.currentTimeMillis() 返回的值比预期低 1800000 毫秒
long till = requestTimeFromWebService()
long now=System.currentTimeMillis();
long remaining_time = till - now;
Calendar c=Calendar.getInstance();
c.setTimeInMillis(remaining_time);
int minutes=c.get(Calendar.MINUTE);
System.out.println(""+minutes+"m");
int seconds=c.get(Calendar.SECOND);
System.out.println(""+seconds+"s");
如果设置了 GMT+2 罗马时区,则使用此代码System.out.println(""+minutes+"m"); 打印(例如)5m,如果设置了 GMT+8 吉隆坡时区,则打印35m。
这是一个已知的错误吗? 我发现了这个:http://www.objectdb.com/database/forum/363 这似乎证实了一个问题。
我还发现了这个:https://en.wikipedia.org/wiki/Time_in_Malaysia
Blockquote 1981 年 12 月 31 日当地时间 2330 时,马来西亚半岛的人们将时钟和手表提前 30 分钟,以成为 1982 年 1 月 1 日当地时间 00:00 时,以匹配东马使用的时间,这是UTC + 08:00。 这可以解释错误出现在哪里。
有什么建议吗?
【问题讨论】:
-
30000 millis是 30 秒,而不是 30 分钟 -
您设备的日期是什么时候?
-
某些时区不是 UTC 整小时的时间:timeanddate.com/time/time-zones-interesting.html。您也可以获取用户的 UTC 偏移量并使用它:TimeZone.getOffset()
-
嗯,这里有些东西没有意义。
System.currentTimeMillis()严格根据 UTC 返回时间。如果您的输入时间戳也基于 UTC,则时区无关紧要。 -
c.setTimeInMillis(millis);在这种情况下millis是什么? (我怀疑它是remaining_time值,在这种情况下,一切都有意义,因为它代表纪元之后的一小段时间,大约是 1/1/1970 00:15 左右,这是马拉西亚的时区不是的时间gmt+8. -> 不要使用日历来显示时差)
标签: java android date timezone unix-timestamp