サーバーとクライアントが異なるタイムゾーンにある場合、クライアントのタイムゾーンをHttpServletRequestを使用してJavaで取得できますか?
私はこのようなクライアントの「ロケール」を使用して「カレンダー」のインスタンスを作成しようとしています、
Calendar calendar = Calendar.getInstance(request.getLocale());
TimeZone clientTimeZone = calendar.getTimeZone();
しかし、これは私にサーバーのタイムゾーンのみを与えています。
この方法は間違っていますか?サーバーでクライアントのタイムゾーンを取得する他の方法はありますか?
リクエストオブジェクトからブラウザのタイムゾーンを取得する方法は2つあります。
ブラウザからリクエストを行う場合は、JavaScriptを使用してリクエストオブジェクトにパラメータを追加します。以下のコマンドは、ブラウザーのタイムゾーンを示します。
Intl.DateTimeFormat().resolvedOptions().timeZone
このコマンドを使用すると、タイムゾーンの例「Pacific/Fakaofo、Pacific/Honolulu」を表す文字列を取得できます。このタイムゾーンは、サーバー側のリクエストオブジェクトから取得できます。
String timezoneStr = request.getParameter("your_parameter_name");
この文字列をTimezone.getTimeZone(timezoneStr);に渡します。ブラウザの時間のタイムゾーンオブジェクトを返します
これを行う別の方法は、要求セッションからzoneOffsetを取得することです。セッションには、GMT時刻を取得するために必要な整数形式のzoneOffset値が含まれています。以下はサンプルです:
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);
これらのメソッドのいずれかを使用してタイムゾーンを取得し、カレンダーオブジェクトを定義されたタイムゾーンに変換します。
どちらの方法でも、秒数にはクライアント側のコードは必要ありませんが、サーバー側で多くの検証が必要です。最初のアプローチでは、クライアント側で小さな変更とサーバー側で小さな変更が必要です。好みはあなた次第です。