Ответ 1
К сожалению, информация о часовом поясе не передается в HTTP request
.
Но для этого есть работа.
Когда сервер и клиент находятся в разных часовых поясах, могу ли я получить часовую зону клиента в java с помощью HttpServletRequest?
Я пытаюсь создать экземпляр "Calender", используя клиентский "Locale", как это,
Calendar calendar = Calendar.getInstance(request.getLocale());
TimeZone clientTimeZone = calendar.getTimeZone();
Но это дает мне только часовой пояс сервера.
Является ли этот метод неправильным? Есть ли другой способ получить часовой пояс клиента на сервере?
К сожалению, информация о часовом поясе не передается в HTTP request
.
Но для этого есть работа.
есть два способа получить часовой пояс браузера от объекта запроса.
когда вы делаете запрос из браузера, добавьте параметр для запроса объекта с помощью javascript. Команда ниже предоставляет часовой пояс браузера:
Intl.DateTimeFormat().resolvedOptions().timeZone
с помощью этой команды вы получите строку, представляющую пример часовой пояс "Pacific/Fakaofo, Pacific/Honolulu", вы можете получить этот часовой пояс из объекта запроса на стороне сервера, используя
String timezoneStr = request.getParameter("your_parameter_name");
передать эту строку в Timezone.getTimeZone(timezoneStr); вернет объект часовой пояс для времени браузера
Другой способ сделать это - получить zoneOffset из сеанса запроса. Сессия содержит значение zoneOffset в целочисленной форме, с которой вам нужно получить время GMT. ниже - образец:
public static String getGMTSignedZone(HttpServletRequest request)
{
String zoneOffset;
HttpSession session = request.getSession();
zoneOffset = (String)session.getAttribute("timezone");
if(zoneOffset != null && !zoneOffset.equals(""))
{
Integer zMinutes = Integer.valueOf(zoneOffset);
String sign = (zMinutes < 0) ? "+" : "-";
String hourString;
String minString;
if(zMinutes < 0)
{
zMinutes = zMinutes*(-1);
}
// hours 0 to 23
int hours = zMinutes/60;
if(hours > 23)
{
hours = hours/24;
}
if(hours < 10)
{
hourString = "0" + hours;
}
else
{
hourString = "" + hours;
}
//minute conversion
int minutes = zMinutes - (hours*60);
if(minutes < 10)
{
minString = "0" + minutes;
}
else
{
minString = "" + minutes;
}
return ("GMT" + sign + hourString + minString);
}
return zoneOffset;
}
возврат выше может быть легко преобразован в часовой пояс, используя следующий код:
StringBuffer buffer = new StringBuffer("");
int absOffset = Math.abs(offset);
int hrs = absOffset/60;
int mins = absOffset%60;
buffer.append("GMT").append(offset > 0 ? "-" : "+").append(hrs < 10 ? "0" : "").append(hrs).append(":").append(mins < 10 ? "0" : "").append(mins);
String tzID = buffer.toString();
TimeZone tz = TimeZone.getTimeZone(tzID);
использовать любой из этих методов для получения часового пояса и конвертировать ваш объект календаря в определенный часовой пояс.
из обоих методов секундам dosen't требуется какой-либо код на стороне клиента, но большая проверка на стороне сервера, а первый подход требует небольших изменений на стороне клиента и небольших изменений на стороне сервера. Это зависит от вас, что вы предпочитаете.