2010-05-23 77 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)); 
    } 

}