通过浏览器偏移量进行时间转换



我使用浏览器偏移时间将给定时间转换为本地时间。下面是我用于将时间从大西洋时区(-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这段代码返回两个时区的精确结果。但是我需要使用浏览器偏移时间来解决这个问题。

你犯了几个常见的错误:

  • 你有一个固定的偏移量,你从浏览器获得-可能通过JavaScript代码,如new Date().getTimezoneOffset()。这将是客户端在当前日期和时间与UTC的偏移量。您不能将此偏移量应用于任意时间戳,因为客户端的偏移量可能会根据您请求的时间点而不同。请参阅时区标签wiki中的"time zone != offset",并查看如何猜测用户的实际时区的答案。

  • 您正在通过加法和减法对时间戳和偏移量进行大量手动操作。这种代码应该避免,除非您正在编写日期/时间库。Java有许多不错的选择,例如Java 7及更早版本的Joda-Time,以及Java 8及更新版本的内置java.time包。您应该避免使用java.util.Datejava.util.Calendar api,因为它们存在许多挑战。

  • 当你做像new Date(timestamp + offset)这样的事情时-你实际上并没有执行时区转换。与java.util.Date对象交互的所有内容都期望时间戳基于Unix Epoch,它显式地以UTC (1970-01-01T00:00:00Z)表示。所以如果你添加或减去一个偏移量,你只是选择了一个不同的时刻。如果您使用较新的api,则不必考虑此问题。

  • 您正在计算serverTimeOffset作为基准偏移量+ DST偏差,但您没有考虑DST是否有效。如果您使用较新的api,您也不必考虑这个问题。

相关内容

  • 没有找到相关文章

最新更新