2010-05-23 78 views
17

我想知道当前的日期和时间。Java - 如何获取与系统日期无关的当前日期?

代码

Calendar.getInstance(); 

表示在其上程序正在运行,系统日期可以是错误的系统的日期和时间。

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

+2

日期是一个相对的事情......没有“正确的当前日期”这样的事情,除非你指的是特定的时区。 – 2010-05-23 12:11:10

+0

好的..我怎样才能得到某个特定时区的正确日期和时间? – 2010-05-23 12:12:46

+0

您必须从您当前系统的日期和时间开始 - 是吗? – Mark 2010-05-23 12:14:40

回答

4

如果您在互联网上,您可能会问一个已知和可信的时间源。如果运行程序的人想要阻止程序执行此操作(例如,如果您授予他们有时间限制的许可证并且他们不想花费更多时间),则他们可能会欺骗或阻止该连接。

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

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

0

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

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

7

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

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

在早于1.1是标准使用Date级的Java版本:

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 
+4

哇,29 upvotes并没有回答这个问题,它具体询问如何得到系统时钟错误时的真实日期。 – 2017-01-01 23:39:25

+0

@Paul Tomblin这个问题的原始标题是“Java - 如何获得当年?”这与实际问题不符。修改了。 – ltlBeBoy 2018-02-21 12:37:25

+0

@ltlBeBoy我想这是太多的期望问题回答者和upvoters阅读比标题更多。 – 2018-02-22 12:37:51

0

下面是一些代码,从你选择的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)); 
    } 

}