有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

通过浏览器偏移进行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) 个答案

  1. # 1 楼答案

    您会犯几个常见错误:

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

    • 你需要通过加法和减法对时间戳和偏移量进行大量手动操作。除非您正在编写日期/时间库,否则应该避免使用这种代码。Java有很多好的选项,比如Joda-Time用于Java7和更早版本,而the built-in ^{} package用于Java8和更新版本。您应该避免使用java.util.Datejava.util.CalendarAPI,因为这些API有很多挑战

    • 当您执行类似new Date(timestamp + offset)的操作时,实际上并不是在执行时区转换。与java.util.Date对象交互的所有对象都希望时间戳基于Unix纪元,它明确以UTC(1970-01-01T00:00:00Z)为单位。所以,如果你加上或减去一个偏移量,你只是在时间上选择了一个不同的瞬间。如果使用较新的API,就不必考虑这一点

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