2010-03-09 48 views
9

在我的Web應用程序中,我有用戶在簡單的文本框中輸入日期。該輸入(當然是經過消毒處理後)通過strtotime()運行,並添加86399,以使該時間戳寫入一天的結尾(11:59:59)。這是截止日期的目的(所以如果日期的推移,應用程序引發的標誌)3月14日不是86400秒長?

對於我測試,它的工作的日子......

1月5日保存爲1月5日,在的結束天。

3月13日保存爲3月13日

保存爲3月15日

3月14日,無論出於何種原因3月15日,挽救了自己的3月15日。

是3月14日神祕地幾秒鐘短什麼?


更新:感謝oezi的解決方案 - 像魅力一樣工作。根據要求代碼:

舊代碼:

if ($_POST['dateto'] != '') { 
    $dateto = strtotime(mysql_real_escape_string($_POST['dateto'])) + 86399; 
} 

新代碼:

# Offset to "end of day" 
list($y,$m,$d) = explode('-',date("Y-m-d",strtotime($_POST['dateto']))); 
$d++; 
$dateto = strtotime($y . '-' . $m . '-' . $d) - 1; 
+1

發佈您的代碼。 – Nate 2010-03-09 18:37:52

+3

您可能會有更多運氣解析日/月/年部分,將23:59:59附加到它並轉換爲unix樣式的時間戳。 – meagar 2010-03-09 18:40:10

+3

謹防三月的伊德斯! – 2010-03-09 18:48:46

回答

2

像其他人說的開始,這是因爲夏令時。要解決這個問題,你可以這樣做:

<?php 
list($y,$m,$d) = explode('-',date("Y-m-d",strtotime($date_from_user))); 
$h = 23; 
$i = 59; 
$s = 59; 
$mytimestamp = "$y-$m-$d $h:$i:$s"; 
?> 
18

2010年3月14日這一天日光節約時間開始在美國。所以如果你在當地時區做數學,3月14日只有23小時。

+0

感謝您的提醒......這不是關鍵任務,所以我認爲我的代碼中的這個錯誤現在可能會被揭穿;) – 2010-03-09 19:02:47

-1

http://tycho.usno.navy.mil/leapsec.html

並不是所有的天86400秒。

這是罕見的事件。並且(歷史上)從未在三月安排。

+0

根據維基百科,閏秒「通常安排在6月30日結束,或者12月31日(儘管閏秒可以在任何月末應用)「。資料來源:http://en.wikipedia.org/wiki/Leap_second – 2010-03-09 18:39:58

+1

確實如此,但需要注意的是POSIX時間相關庫函數(mktime,gmtime等)需要忽略閏秒 - 所以time_t 23:59:59和00:00:00第二天的值將總是相差1秒,即使在23:59:60出現了中間跳躍秒。 (Shakes fist ...) – 2010-03-09 18:57:17

+0

此外,大多數計算系統不考慮閏秒 – 2010-03-09 18:58:06

3

我會假設,因爲這是daylight savings time

+5

請先生,我可以節省更多的日光嗎? – 2010-03-09 19:13:29

+0

非常好我不會拼寫,是的,我是一個英語母語的人 – rerun 2010-03-09 21:41:27

1

你使用了哪個數據庫?必須有更好的方法來做到這一點(大多數日期操作命令是特定於數據庫的)。在SQL Server中,我只是加1天的日期,然後減去1秒:

DECLARE @YourDate datetime 
SET @YourDate='2010-03-14' 

SELECT DATEADD(ss,-1,@YourDate+1) 

OUTPUT:

----------------------- 
2010-03-14 23:59:59.000 

(1 row(s) affected) 

東西它是值得的,我更喜歡有一個條件:< NextDay<=CurrentDay12_59_59

+0

我將日期作爲unix時間戳存儲在數據庫中,這是一個十位數的整數...我想它可能會更好使用日期時間類型,但做了什麼... 關於日期+ 1-1秒的有趣點...我會研究它。 – 2010-03-09 19:04:41

相關問題