2014-01-19 60 views
2

參見下面的代碼爲什麼的strtotime給出不同的值

$compDate = date('d/m/y',strtotime('-2 weeks')); 
echo strtotime($compDate)."-->".strtotime('-2 weeks'); 

回聲輸出1398882600-->1388938336

爲什麼時間戳有什麼不同?

回答

0

的第一個問題是錯誤的格式 - 由Sharanya Dutta說。第二個是你在格式化爲m/d/y而不是m/d/y, H:i:s時失去了精度。

$compDate = date('m/d/y',strtotime('-2 weeks')); 

print date("d.m.Y @ H:i:s", strtotime($compDate)); //05.01.2014 @ 00:00:00 
print date("d.m.Y @ H:i:s", strtotime('-2 weeks')); //05.01.2014 @ 17:23:42 

當您添加小時,分鐘和秒來$compDate,它會如預期

$compDate = date('m/d/y, H:i:s',strtotime('-2 weeks')); 
var_dump(strtotime($compDate) === strtotime('-2 weeks')); // TRUE 

如果您不需要的時間,但只有日期,你可以設置時間也在strtotime()

$compDate = date('m/d/y',strtotime('-2 weeks')); 
var_dump(strtotime($compDate) === strtotime('-2 weeks, 0:0:0')); // TRUE 
+0

你是對的,它的精度和格式是 –

+1

恩,是的。當你在代碼中調用'strtotime' * *時,它會返回一個不同的值。時間已過。 – Anthony

+0

即使在這種情況下,時間戳也不會有太大差異。我可以一秒鐘刷新至少3次。 :) –

2

這是從PHP手冊:

日期在M/d/y或DMY格式通過查看在各個組件之間的分離器消除歧義:如果分離器是斜線(/),那麼假設美國的m/d/y;而如果分隔符是破折號( - )或點(。),則假定歐洲的d-m-y格式。

因此改變d/m/y要麼d-m-ym/d/ystrtotime將很好地工作。

更新:是的,kingkero是正確的。您必須將d/m/y更改爲d-m-y H:i:sm/d/y H:i:s。關鍵是你不能忽視小時,分鐘和秒。

+0

我測試 'DMY',和它不匹配 –

+0

'米/ d/Y:1388860200 - > 1388939310''DMY:1105641000- - > 1388939260'我不明白 –

0

strtotime假定x/x/x符號是美國和x-x-x符號歐洲。既然你在d/m/Y正在傳遞的格式爲$compDate,然後傳遞一個日期字符串通過strtotime()爲第二次,它被解釋日期字符串作爲m/d/Y第二次。您可以通過改變這樣的代碼確認:

$compDate = strtotime('-2 weeks'); 
echo $compDate . "-->" . strtotime('-2 weeks'); 

或者這樣說:

$compDate = date('d-m-y',strtotime('-2 weeks')); 
echo strtotime($compDate) . "-->" . strtotime('-2 weeks'); 

或者這樣說:

$compDate = date('m/d/y',strtotime('-2 weeks')); 
echo strtotime($compDate) . "-->" . strtotime('-2 weeks'); 

一個更好的解決辦法是使用DateTime類,它允許您使用createFromFormat定義給定字符串的日期格式,以便解析器知道哪個數字是:

$compDate = date('d/m/y',strtotime('-2 weeks')); 
$compDateObject = DateTime::createFromFormat('d/m/y', $compDate); 
echo $compDateObject->format('U') . "-->" . strtotime('-2 weeks'); 

最後一個例子有點令人費解,因爲通常使用像-2 weeks這樣的相對字符串,你不需要擔心格式化,但我猜你真正遇到的問題是使用的日期格式整個代碼在d/m/y,所以上面給出瞭如何在該格式和和時期時間戳之間進行交換的想法。如果你想使用DateTime得到一個相對日期(如-2 weeks),你可以改造爲以上:

$compDate = new DateTime('-2 weeks'); 
echo $compDate->format('U') . "-->" . strtotime('-2 weeks'); 
echo $compDate->format('d/m/Y'); 

如果你想在時間戳是日期,但不希望使用時間,你可以添加到today相對格式,像這樣:

$compDate = new DateTime('2 weeks ago today'); 
echo $compDate->format('U') . "-->" . strtotime('-2 weeks 00:00'); 
echo $compDate->format('d/m/Y'); 
+0

$ compDate = date('d-m-y',strtotime(' - 2 weeks')); echo strtotime($ compDate)。 「 - >」。 strtotime(' - 2周');不會像上面說的那樣給o/p –

相關問題