2016-01-11 55 views
0

因此,我將代碼從PHP移植到Java。部分代碼具有時間敏感散列算法,其中當前的Unix時間戳用作種子。我遇到了這樣的問題:我的移植代碼在兩種語言中給我不同的答案。我懷疑它可能在實施或其他方面稍有不同。爲什麼Java和PHP的時代不同?

我在想這個問題是不是很模糊,比如this。儘管如此,任何幫助將不勝感激。

這是我在Java中的代碼。

private static int generateB() { 
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy", Locale.US); 

    Date start; 
    Date now; 
    try { 
     start = sdf.parse("01/01/1970"); 
     now = new Date(); 
    } catch (ParseException e) { 
     return 402890; 
    } 
    long diff = now.getTime() - start.getTime(); 
    long hours = diff/(60 * 60 * 1000) % 24; 
    long days = diff/(24 * 60 * 60 * 1000); 
    return (int) (hours + days * 24); 
} 

這裏是PHP代碼:

/** 
* Generate "b" parameter 
* The number of hours elapsed, since 1st of January 1970 
* 
* @return int 
*/ 
private function generateB() 
{ 
    $start = new \DateTime('1970-01-01'); 
    $now = new \DateTime('now'); 
    $diff = $now->diff($start); 
    return $diff->h + ($diff->days * 24); 
} 

然而,他們返回不同的結果,過了3個小時是準確的。

在這篇文章的時候。 PHP返回403472,而Java返回403475.同樣,如果我使用System.currentTimeMillis(),我得到403480.

所以我的問題是爲什麼有什麼區別呢?我的意思是減3可以解決我的問題,但我只是好奇未來的參考爲什麼差異存在。注意:我通過PHP Sandbox運行PHP進行測試。

+1

你的時區是什麼時區? 如果我記得,Java時間戳總是以UTC時間表示。 –

+0

在Java代碼中,您明確地定義了時區的外觀(我不太瞭解Java),但在PHP代碼中,DateTime調用沒有給出時區。我相信時代是格林尼治標準時間。 – RamRaider

+0

這絕對是一個確切的小時數?你檢查了毫秒數來確認嗎?如果是這樣,我的猜測會在時區上有所不同。 – DaveyDaveDave

回答

0

看你的報價

在這篇文章的時間。 PHP的返回403472,而Java返回403475.另外,如果我用System.currentTimeMillis的()我得到403480.

這一切看起來正常的 - 還有你的PHP和Java,以及最重要的是5秒3秒。我想這可能是您花時間切換過程並運行測試所花費的時間。

php > echo date('Y-m-d H:i:s', 403472); 
1970-01-05 17:04:32 
php > echo date('Y-m-d H:i:s', 403475); 
1970-01-05 17:04:35 
php > echo date('Y-m-d H:i:s', 403480); 
1970-01-05 17:04:40 
+2

再次查看代碼。 OP正在試圖計算自時代以來的小時數,所以它不是三秒鐘;這是三個***小時***。 – dcsohl

相關問題