有哪些方法可以在Java中为XenApp检索时区设置?

时间:2012-05-09 07:13:42

标签: java xenapp

我们的Java应用程序使用

TimeZone tz = TimeZone.getDefault()

是否有其他方法可以获取机器的时区设置?

背景

在我们的应用程序运行的所有环境中,使用TimeZone.getDefault()已经很好地为我们工作了:独立的Java应用程序,在Tomcat 5/6/7内,在Windows XP,Windows 7和Windows Server上2003/2008,32和64位。

但是,最近我们已经开始在Windows 2008 R2上通过XenApp 6.5远程运行应用程序。在此环境中,我们的应用所看到的时区是服务器时区,而不是客户端的时区,即使XenApp已配置为执行"time zone redirection"。我们正在运行Java 1.6.0 update 30.

3 个答案:

答案 0 :(得分:0)

您可以使用日历对象从此对象创建和获取时区。例如:

TimeZone tz = Calendar.getInstance().getTimeZone();  

答案 1 :(得分:0)

System.getProperty("user.timezone");

答案 2 :(得分:0)

这似乎是Java和Citrix XenApp的已知问题。即使是IBM的基于Java的Lotus Notes客户端也会遇到这个problem。不幸的是,我无法在任何地方找到解决方案。

通过编写一个非常简单的C#程序来获取时区,我能够解决这个问题。这正确地读取了客户端的时区。我使用NodaTime库以tz database格式读取时间,这是Java用于识别时区的内容。这是程序:

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()和描述here的技术来执行这个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) );
}

所有这些都很复杂,是的,但似乎有效。