我们的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.
答案 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) );
}
所有这些都很复杂,是的,但似乎有效。