通过浏览器偏移进行java时间转换
我使用浏览器偏移时间将给定时间转换为本地时间。下面是我用来将时间从大西洋时区(-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);
这段代码返回的是东部标准时间上午10:00的精确结果,返回的是上午8:00,应该是上午9:00
https://stackoverflow.com/a/21349556/3739916这段代码返回两个时区的精确结果。但我需要用浏览器偏移时间来计算
# 1 楼答案
您会犯几个常见错误:
您已经从浏览器获得了一个固定的偏移量——可能是通过像
new Date().getTimezoneOffset()
这样的JavaScript代码获得的。这将是客户在当前日期和时间的UTC偏移量。您不能仅将此偏移量应用于任意时间戳,因为客户端的偏移量可能会因您请求的时间点而异。请参阅the timezone tag wiki中的“时区!=offset”,并参阅this answer了解如何猜测用户的实际时区你需要通过加法和减法对时间戳和偏移量进行大量手动操作。除非您正在编写日期/时间库,否则应该避免使用这种代码。Java有很多好的选项,比如Joda-Time用于Java7和更早版本,而the built-in ^{} package 用于Java8和更新版本。您应该避免使用
java.util.Date
和java.util.Calendar
API,因为这些API有很多挑战当您执行类似
new Date(timestamp + offset)
的操作时,实际上并不是在执行时区转换。与java.util.Date
对象交互的所有对象都希望时间戳基于Unix纪元,它明确以UTC(1970-01-01T00:00:00Z
)为单位。所以,如果你加上或减去一个偏移量,你只是在时间上选择了一个不同的瞬间。如果使用较新的API,就不必考虑这一点您正在计算
serverTimeOffset
作为基准偏移量+DST偏差,但您没有考虑DST是否有效。如果使用较新的API,也不必考虑这一点