2016-11-17 76 views
0

我使用的浏览器偏移时间给定时间本地时间转换。这里是我用来将时间从大西洋时区(-4:00)转换为IST的代码。通过浏览器时间转换偏移

int hours=23; 
int mins =30; 
Calendar date=Calendar.getInstance(); 
date.set(Calendar.HOUR_OF_DAY, hours); 
date.set(Calendar.MINUTE, mins); 
browserOffsetTime=-browserOffsetTime; 
TimeZone defaultTZ=TimeZone.getTimeZone("Atlantic/Bermuda"); 
int serverTimeOffset=defaultTZ.getRawOffset()+defaultTZ.getDSTSavings(); 
Date GMTDate= new Date(date.getTimeInMillis() - serverTimeOffset); 
Date userBrowserTime = new Date(GMTDate.getTime() + browserOffsetTime); 
Calendar cal1=Calendar.getInstance(); 
cal1.setTime(userBrowserTime); 

此代码返回EST的确切结果,它是上午10:00,因为它返回上午8:00,应该是上午9:00。

https://stackoverflow.com/a/21349556/3739916此代码返回两个时区确切的结果。但我需要使用浏览器偏移时间来解决这个问题。

+1

难道夏季储蓄问题可以解释一个小时的差异吗? –

+0

@TimBiegeleisen我在没有添加夏令时的情况下进行了检查,结果仍然相同。 – SwethaHarshini

+0

@TimBiegeleisen对不起,我没有立即理解你。那么,我是否应该使用浏览器偏移时间进行时间转换? – SwethaHarshini

回答

1

您正在几个常见的错误:

  • 你已经有了一个固定的偏移,你从浏览器获得的 - 可能通过JavaScript代码像new Date().getTimezoneOffset()。这将是客户端在当前日期和时间与UTC的偏移量。您不能将此偏移量应用于任何时间戳,因为客户端的偏移量可能会因您要求的时间点而有所不同。请参阅the timezone tag wiki中的“时区!=偏移量”,并参阅this answer了解如何猜测用户的实际时区。

  • 你通过加减做了很多的时间戳和偏移的手动操作的。除非您创作日期/时间库,否则应避免使用此类代码。 Java有许多不错的选择,例如用于Java 7及更早版本的Joda-Time,以及用于Java 8及更新版本的the built-in java.time package。你应该避免使用java.util.Datejava.util.Calendar API,因为有这些许多挑战。

  • 当你做这样的事情new Date(timestamp + offset) - 你是不是真正执行时区转换。这与java.util.Date对象进行交互的一切期待的时间戳是基于Unix的时代,这是明确UTC(1970-01-01T00:00:00Z)的条款。所以如果你增加或减去一个偏移量,你只是在时间选择不同的时间。如果您使用较新的API,则不必考虑这一点。

  • 您计算serverTimeOffset作为基本偏移+的DST偏,但你不考虑DST是否是有效。如果您使用较新的API,则不必考虑这一点。