Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-如何使当前日期独立于系统日期?_Java_Date_Calendar - Fatal编程技术网

Java-如何使当前日期独立于系统日期?

Java-如何使当前日期独立于系统日期?,java,date,calendar,Java,Date,Calendar,我想知道现在的日期和时间 代码 Calendar.getInstance(); 表示运行程序的系统的日期和时间,系统日期可能错误 那么,有没有任何方法可以让我获得正确的当前日期和时间,而不考虑程序运行的系统的日期和时间?编程级方法是为了从系统本身获取日期和时间而开发的。除了指定的系统之外,不能修改它们以获取日期 对于您的附加要求,如果您真的想要它,您需要在您的客户机和服务器之间进行同步。如果您在internet上,您可能可以询问已知且可信的时间源。如果运行你的程序的人想阻止你的程序这样做(比如

我想知道现在的日期和时间

代码

Calendar.getInstance();
表示运行程序的系统的日期和时间,系统日期可能错误


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

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


对于您的附加要求,如果您真的想要它,您需要在您的客户机和服务器之间进行同步。

如果您在internet上,您可能可以询问已知且可信的时间源。如果运行你的程序的人想阻止你的程序这样做(比如如果你给了他们一个有时间限制的许可证,他们不想支付更多的时间),他们可能会欺骗或阻止连接

在我参与的一个项目中,我们在硬件中放置了一个安全、可靠的时间源,不能篡改。它是为加密和授权而设计的,并且有一个Java库来访问它。对不起,我记不起设备的名称


所以答案可能是肯定的,也可能是否定的。

您的系统可以访问互联网吗?如果是这样,您可以使用精确时间服务的同步(例如:)并授予您想要的时间。

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

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

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

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


下面是一些代码,可以从您选择的web服务器获取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));
  }

}
package some.package;
导入java.io.IOException;
导入java.net.URL;
导入java.net.URLConnection;
导入java.util.List;
导入java.util.Map;
公开课考试{
私有静态字符串getServerHttpDate(字符串serverUrl)引发IOException{
URL=新URL(服务器URL);
URLConnection=url.openConnection();
Map httpHeaders=connection.getHeaderFields();
对于(Map.Entry:httpHeaders.entrySet()){
字符串headerName=entry.getKey();
if(headerName!=null&&headerName.equalsIgnoreCase(“日期”)){
返回条目.getValue().get(0);
}
}
返回null;
}
公共静态void main(字符串[]args)引发IOException{
字符串服务器URL=args.length>0?args[0]:“https://google.com";
System.out.println(getServerHttpDate(serverUrl));
}
}

日期是相对的。。。除非你指的是一个特定的时区,否则没有“正确的当前日期”这样的事情。。我如何才能获得特定时区的正确日期和时间?你必须从当前系统的日期和时间开始-可以吗?你到底为什么不定期将系统时钟与NTP同步?!这是一个已解决的问题。即使这件事经常离线,系统时钟也不应该漂移太多,以致于它把这一年搞错了@Donal你不知道Yatendra为什么要这么做。也许他写的软件有试用期,应该在某个日期后禁用。在这种情况下,你不能相信本地系统的日期和时间,因为用户可能故意篡改它,使软件在试用期满后仍能工作。哇,29次投票,但它没有回答问题,具体问题是当系统时钟出错时如何获取实际日期。@Paul Tomblin这个问题的原始标题是“Java-如何获取当前年份?”这与实际问题不符。修改了它。@ltlBeBoy我想,期望回答问题的人和投票人读得比标题还多是太过分了。
Calendar now = Calendar.getInstance();   // Gets the current date and time
int year = now.get(Calendar.YEAR);       // The current year
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));
  }

}