2012-06-25 39 views
5

我在android手机(Nexus one)和java服务器之间进行时间转换时遇到了一些麻烦。我读过的所有东西都说它们是相同的,但是当我从我身上转换一个长时间戳时似乎失去了1小时(正好)。Android时间vs Java时间

具体来说,如果我的Android设备,我得到了下面的输出上运行下面的代码

代码:

Calendar g = Calendar.getInstance(); 
g.setTimeInMillis(1340661899000L); 
Log.d(TAG, g.getTime().toLocaleString()); 

输出: 2012年6月25日下午6时04分59秒

我认为这是正确的,但是当我在java服务器上运行完全相同的代码时,我得到了同一天,但提前1小时

代码:

Calendar g = Calendar.getInstance(); 
g.setTimeInMillis(1340661899000L); 
System.out.println(g.getTime().toLocaleString()); 

输出: 25军2012年下午5时04分59秒

有谁知道什么可能会造成这个?服务器和手机都位于相同的地方(不是它应该很重要),并且服务器盒和手机上的时钟匹配

+1

您可能不希望在客户端和服务器之间的通信中使用本地化时间,因为您无法确定客户端上的时间区域设置是什么。 –

+0

值1340661899000L不应该是当地时间,我只想显示设备时区中的给定时间 –

+2

期望客户端和服务器都处于相同的时区/模式,这是我建议您避免的情况。 –

回答

4

考虑到这是一个小时的差异,你可能有DST(日光节省时间)设置在服务器上而不是在电话上,反之亦然?

+0

现在,我只是觉得自己像一个白痴。 Ya出于某种原因,即使手机上的时钟是正确的时间,toLocaleString的电话版本也没有考虑到DST。 –

+0

@JohnS这是为什么你应该避免使用本地日期时间值的例子。保持你的数据通信,业务逻辑,数据存储和服务器时钟都在[UTC](http://en.m.wikipedia.org/wiki/Coordinated_Universal_Time)(除少数例外)。只有在数据的用户或消费者预期时才转换为本地时区。 –

1

克里斯试图说的是,你的手机和服务器可能被配置为不同的时区。

试试打印cal.getTimeZone()的结果。如果这是您希望选择用于通信的时区的问题。例如:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+0")); 

根据日历实例使用报告的默认时区由JavaDoc中:

TimeZone.getDefault() 

尽管您的服务器和移动被设置为相同的时区可能并不一定意味着它们使用相同的默认TimeZone。