我使用浏览器偏移时间将给定时间转换为本地时间。这是我用来将时间从大西洋时区(-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此代码会返回两个时区的确切结果。但我需要使用浏览器偏移时间来解决这个问题。
答案 0 :(得分:1)
你犯了几个常见的错误:
您有一个从浏览器获得的固定偏移量 - 可能通过new Date().getTimezoneOffset()
等JavaScript代码。这将是客户端在当前日期和时间与UTC的偏移量。您不能将此偏移量应用于任何时间戳,因为客户端的偏移量可能会有所不同,具体取决于您要求的时间点。请参阅the timezone tag wiki中的“时区!=偏移量”,并参阅this answer了解如何猜测用户的实际时区。
您正在通过加法和减法对时间戳和偏移进行大量手动操作。除非您正在编写日期/时间库,否则应避免使用此类代码。 Java有很多不错的选择,例如Java 7及更早版本的Joda-Time和Java 8及更新版本的the built-in java.time
package。您应该避免使用java.util.Date
和java.util.Calendar
API,因为这些有很多挑战。
当您执行new Date(timestamp + offset)
之类的操作时 - 您实际上并未执行时区转换。与java.util.Date
对象交互的所有内容都期望时间戳基于Unix Epoch,它明确地以UTC(1970-01-01T00:00:00Z
)表示。因此,如果您添加或减去偏移量,您只是选择不同的时刻。如果您使用较新的API,则无需考虑这一点。
您正在计算serverTimeOffset
作为基准偏移+ DST偏差,但您没有考虑DST是否生效。如果您使用较新的API,则无需考虑这一点。