2

私たちのJavaアプリケーションは

TimeZone tz = TimeZone.getDefault()

マシンのタイムゾーン設定を取得する他の方法はありますか?

バックグラウンド

使用TimeZone.getDefault()は、アプリケーションが実行されるすべての環境で、かなり長い間非常にうまく機能しました。スタンドアロンJavaアプリケーション、Tomcat 5/6/7内、Windows XP、Windows 7、およびWindows Server 2003 / 2008、32および64少し。

ただし、最近、Windows2008R2上でXenApp6.5を介してアプリケーションをリモートで実行し始めました。この環境では、XenAppが「タイムゾーンリダイレクト」を実行するように構成されている場合でも、アプリが認識するタイムゾーンはサーバーのタイムゾーンであり、クライアントのタイムゾーンではありません。Java 1.6.0update30で実行しています。

4

3 に答える 3

0

カレンダー オブジェクトを使用して、このオブジェクトからタイム ゾーンを作成および取得できます。例:

TimeZone tz = Calendar.getInstance().getTimeZone();  
于 2012-05-09T07:20:20.480 に答える
0
System.getProperty("user.timezone");
于 2012-05-09T07:21:07.557 に答える
0

これは、Java および Citrix XenApp の既知の問題のようです。IBM の Java ベースの Lotus Notes クライアントでさえ、この問題に悩まされています。残念ながら、どこにも解決策が見つかりませんでした。

タイム ゾーンを取得する非常に単純な C# プログラムを作成することで、この問題を回避することができました。これにより、クライアントのタイム ゾーンが正しく読み取られます。NodaTimeライブラリを使用して、Java がタイム ゾーンを識別するために使用するtz データベース形式で時刻を読み取りました。プログラムは次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using NodaTime;

namespace WindowsTimeZoneReader
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(DateTimeZone.GetSystemDefault() + "," + DateTime.Now);
        }
    }
}

Java プログラムから、Runtime.exec() を使用してこの C# プログラムを実行し、ここで説明する手法を使用して、このプログラムの出力を読み取ります。

これを取得したら、Java によって報告されたタイム ゾーンと C# プログラムによって報告されたタイム ゾーンを簡単に比較できます。

String windowsZone = ...; // The result of executing the above C# program
String javaZone = TimeZone.getDefault().getID();
if (!javaZone.equals(windowsZone)) {
  Java.setDefault( TimeZone.getTimeZone(windowsZone) );
}

はい、すべて非常に複雑ですが、うまくいくようです。

于 2012-05-16T07:04:42.440 に答える