这似乎是 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) );
}
一切都非常令人费解,是的,但它似乎有效。