【问题标题】:Java - How to get current date independent from system date? [duplicate]Java - 如何获取独立于系统日期的当前日期? [复制]
【发布时间】:2010-05-23 12:08:26
【问题描述】:

我想知道当前的日期和时间。

代码

Calendar.getInstance();

表示程序运行的系统日期和时间,系统日期可能有误。

那么有什么方法可以让我获得正确的当前日期和时间,而不管程序运行的系统的日期和时间如何?

【问题讨论】:

  • 日期是一个相对的东西...没有“正确的当前日期”之类的东西,除非您指的是特定的时区。
  • ok.. 如何获取特定时区的正确日期和时间?
  • 您必须从当前系统的日期和时间开始 - 可以吗?
  • 为什么不定期将系统时钟与 NTP 同步?!这是一个已解决的问题。即使事情经常离线,系统时钟也不应该漂移那么大,以至于它弄错了该死的
  • @Donal 你不知道为什么 Yatendra 想要这样做。也许(她)他编写的软件有试用期,应该在某个日期后禁用。在这种情况下,您不能信任本地系统的日期和时间,因为用户可能故意篡改它以使软件在试用期到期后仍然可以工作。

标签: java date calendar


【解决方案1】:

在 1.1 之前的 Java 版本中,使用 Date 类是标准的:

Date now = new Date();     // Gets the current date and time
int year = now.getYear();  // Returns the # of years since 1900

但是,在较新版本的 Java 中,大部分 Date 类已被弃用(特别是 getYear 方法)。现在使用Calendar 类更加标准:

Calendar now = Calendar.getInstance();   // Gets the current date and time
int year = now.get(Calendar.YEAR);       // The current year

【讨论】:

  • 哇,29 票,它没有回答这个问题,它专门询问如何在系统时钟错误时获取真实日期。
  • @Paul Tomblin 这个问题的原标题是“Java - 如何获取当前年份?”这与实际问题不符。修改了那个。
  • @ltlBeBoy 我想期望问答者和支持者阅读的内容比标题更多。
【解决方案2】:

我不完全理解你的问题,但我可以回答你的标题:

GregorianCalendar gc = new GregorianCalendar(System.getCurrentTimeMillis());
int year = gc.get(Calendar.YEAR);

【讨论】:

    【解决方案3】:

    如果您在互联网上,您也许可以询问已知且受信任的时间来源。如果运行您的程序的人想要阻止您的程序这样做(例如,如果您给了他们一个有时间限制的许可证,而他们不想为更多时间付费),他们可能会欺骗或阻止该连接。

    在我参与的一个项目中,我们在硬件中放置了一个安全、可信的时间源,无法被篡改。它是为加密和许可而设计的,并且有一个 Java 库来访问它。抱歉,我不记得设备的名称了。

    所以答案可能是,也可能不是。

    【讨论】:

      【解决方案4】:

      您的系统可以上网吗?如果是这样,您可以使用精确时间服务的同步(例如:http://tldp.org/HOWTO/TimePrecision-HOWTO/ntp.html)并授予您想要的权限。

      【讨论】:

        【解决方案5】:

        开发了编程级别的方法以从您的系统本身获取日期和时间。您不能修改它们以获取除系统指定之外的日期。

        对于您的额外要求,如果您真的希望拥有它,您需要在您的客户端计算机和服务器之间进行同步。

        【讨论】:

          【解决方案6】:

          这里有一些代码可以从您选择的网络服务器获取 HTTP 格式(通常是 UTC 时区)的日期。

          当然,如果您无法控制物理硬件和操作系统,没有什么可以保证您能够与您要求的实际 Web 服务器进行通信......但无论如何。

          package some.package;
          
          import java.io.IOException;
          import java.net.URL;
          import java.net.URLConnection;
          import java.util.List;
          import java.util.Map;
          
          public class Test {
          
            private static String getServerHttpDate(String serverUrl) throws IOException {
              URL url = new URL(serverUrl);
              URLConnection connection = url.openConnection();
          
              Map<String, List<String>> httpHeaders = connection.getHeaderFields();
          
              for (Map.Entry<String, List<String>> entry : httpHeaders.entrySet()) {
                String headerName = entry.getKey();
                if (headerName != null && headerName.equalsIgnoreCase("date")) {
                  return entry.getValue().get(0);
                }
              }
              return null;
            }
          
            public static void main(String[] args) throws IOException {
              String serverUrl = args.length > 0 ? args[0] : "https://google.com";
              System.out.println(getServerHttpDate(serverUrl));
            }
          
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-10-24
            • 2017-05-11
            • 1970-01-01
            • 2013-08-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多