3月14日不是86400秒?

时间:2010-03-09 18:36:05

标签: php

在我的网络应用程序中,我让用户在简单的文本框中输入日期。那个输入(当然是在被消毒之后),通过strtotime()运行,并且向它添加86399,以使该时间戳记在当天结束时(11:59:59)。这是截止日期(因此,如果日期过去,应用程序会引发一个标志)

在我测试的那些日子里,它起作用了......

1月5日在当天结束时保存为1月5日。

3月13日保存为3月13日

3月15日保存为3月15日

3月14日,无论出于何种原因,将自己保存为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;

6 个答案:

答案 0 :(得分:18)

2010年3月14日是夏令时在美国开始的日子。所以如果你在当地时区做数学,3月14日只有23个小时。

答案 1 :(得分:3)

我会假设,因为这是daylight savings time

的开头

答案 2 :(得分: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";
?>

答案 3 :(得分:1)

您使用的数据库是什么?必须有更好的方法来执行此操作(大多数日期操作命令是特定于数据库的)。在SQL Server中,我只需在日期中添加1天,然后减去1秒:

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

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

输出:

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

(1 row(s) affected)

对于它的价值,我更喜欢有一个条件:< NextDay而不是<=CurrentDay12_59_59

答案 4 :(得分:1)

在所有“支持”daylight savings time的时区中,您将获得一年两天没有24小时的时间。他们分别有25小时或23小时。甚至不要想到硬编码这些日期。它们每年和时区之间都会发生变化。

哦,这是34 other reasons that you hadn't thought about, and why you shouldn't do what you're doing的列表。

答案 5 :(得分:-1)

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

并非所有日子都是86400秒。

这是一件罕见的事。并且(历史上)从未安排在三月。