2

我们的 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 已配置为执行“时区重定向”。我们在 Java 1.6.0 更新 30 上运行。

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库以tz 数据库格式读取时间,这是 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() 和此处描述的技术来执行这个 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 回答