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

有哪些方法可以在Java中检索XenApp的时区设置?,java,xenapp,Java,Xenapp,我们的Java应用程序使用 TimeZone tz = TimeZone.getDefault() 是否有其他方法获取机器的时区设置 背景 在我们的应用程序运行的所有环境中,使用TimeZone.getDefault已经很好地为我们工作了一段时间:独立Java应用程序,在Tomcat 5/6/7内部,在Windows XP、Windows 7和Windows Server 2003/2008上,32位和64位 然而,最近我们已经开始在Windows2008R2上通过XenApp 6.5远程运行

我们的Java应用程序使用

TimeZone tz = TimeZone.getDefault()
是否有其他方法获取机器的时区设置

背景

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


然而,最近我们已经开始在Windows2008R2上通过XenApp 6.5远程运行该应用程序。在此环境中,我们的应用程序看到的时区是服务器时区,而不是客户端的时区,即使XenApp已配置为执行。我们正在运行Java1.6.0更新30

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

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

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

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

这似乎是Java和Citrix XenApp的一个已知问题。即使是IBM基于Java的Lotus Notes客户端也会受到这种影响。不幸的是,我在任何地方都找不到解决办法

我能够通过编写一个非常简单的C程序来解决这个问题,该程序可以获取时区。这将正确读取客户端的时区。我使用该库以格式读取时间,这是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) );
}

是的,所有这些都非常复杂,但它似乎可以工作。

这似乎是Java和Citrix XenApp的一个已知问题。即使是IBM基于Java的Lotus Notes客户端也会受到这种影响。不幸的是,我在任何地方都找不到解决办法

我能够通过编写一个非常简单的C程序来解决这个问题,该程序可以获取时区。这将正确读取客户端的时区。我使用该库以格式读取时间,这是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) );
}

所有这些都非常复杂,是的,但它似乎是有效的。

您可以向用户询问吗?heikkim,是的,如果我们无法让它正常工作,这是我们最后的选择。然而,这是Citrix XenApp的一个广告特性,它可以在其他非Java应用程序中使用。如果我们不必问用户,我们真的不会问。大多数用户真的不知道他们的时区是什么,当你看列表时,不难看出原因!你能向用户询问一下吗?海基姆,是的,如果我们不能让它正常工作,这是我们最后的选择。然而,这是Citrix XenApp的一个广告特性,它可以在其他非Java应用程序中使用。如果我们不必问用户,我们真的不会问。大多数用户真的不知道他们的时区是什么,当你看列表时,不难看出原因!Java6已经在幕后完成了这项工作。请参阅:java.util.TimeZonegetDefaultJava 6已经在幕后完成了这项工作。请参阅:java.util.TimeZoneGetDefault感谢您的回复。我尝试了这个,它返回的与TimeZone.getdDefault相同。再深入一点看,Calendar似乎通过使用TimeZone.getDefault来获取时区。感谢您的回复。我尝试了这个,它返回的与TimeZone.getdDefault相同。再深入一点,Calendar似乎通过使用TimeZone.getDefault来获取时区。我接受我自己的答案,因为这是我找到的解决实际问题的唯一方法。我接受我自己的答案,因为这是我找到的解决实际问题的唯一方法。