【问题标题】:How to determine if java's user.timezone was altered by the user?如何确定 java 的 user.timezone 是否被用户更改?
【发布时间】:2015-09-29 16:40:23
【问题描述】:

我目前正在寻找一种创造性的方法来确定 java 中的 user.timezone 是否被命令行参数或其他一些自定义配置更改。所以从技术上讲,我正在寻找一种解决方案,如何确定计算机的实际时区(如果这可能的话)。

非常感谢任何帮助。

谢谢,

【问题讨论】:

  • 如果我在 LHR 登上飞机,笔记本设置为当地时间,然后在 LAX 离开飞机,那么“真正的 TZ”是什么???
  • “真正的 TZ”是指您计算机上的设置。例如当您的实际计算机时间设置为 America/Los_Angeles 但使用 -Duser.timezone=UTC 运行 java 时,我想获取 America/Los_Angeles。
  • 启动后修改时区有多种方法。设置 TZ 是一种方法,您可以通过运行具有适当净化环境的 (Java) 子进程来绕过它(参见 java.lang.ProcessBuilder)。但是,如果特权用户(在 Linux 上)入侵了 /etc/timezone,您将无法看到或绕过它。原始时区和被破解的时区都不能是“真实的”时区......

标签: java timezone default


【解决方案1】:

也许你可以根据他们的 ip 和GeoLite2 之类的东西来确定它。 GeoLite2 可以获取城市,并且您可以查找该城市的时区(它甚至可能直接为您提供时区,我不确定)。您可以通过ipinfo 获取他们的 IP。

【讨论】:

  • 我喜欢这个主意!但是我想要一个离线解决方案。
【解决方案2】:

我想到的第一个解决方案是探索外部资源。例如如果你输入

wmic timezone get StandardName

在 Windows 命令行中,您应该获取您的时区。理论上,您可以通过在 Java 中运行此命令来获得输出,如 this thread 中所述。

附:在 Java 中运行一个不起眼的命令可能不是“高质量”的,它也可能不是最有效的事情。这个想法是以某种方式使用另一个不继承 JVM 参数或其他“自定义”的进程(例如命令行、Javascript,可能还有其他脚本语言等)


另一种可能性是(取决于您拥有的客户信息)使用Google's Time Zone API

例如https://maps.googleapis.com/maps/api/timezone/json?location=39.6034810,-119.6822510&timestamp=1331161200

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 2014-06-24
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多