对于strtotime行为我很奇怪

时间:2012-03-11 15:52:00

标签: php date strtotime

我使用jquery datepicker插件获取From日期和To date。以下是POST的输出。

Array (
    [fromDate] => 01/03/2012
    [toDate] => 15/03/2012
    [hdnDownload] => Download
) 

我正在尝试将此日期格式转换为另一种日期格式:

echo'fromdate'.$fromDate = date("Y/n/j", strtotime($_POST['fromDate']));
echo'todate'.$toDate = date("Y/n/j", strtotime($_POST['toDate']));

它给了我以下输出:

fromdate: 2012-1-3
todate:1969-12-31

fromDate很好,但是ToDate已经改变了,请你帮帮我。

4 个答案:

答案 0 :(得分:2)

您应该使用DateTime::createFromFormat()

php > $date = DateTime::createFromFormat('i/n/Y', '15/03/2012');
php > echo $date->format('Y/n/j');
// 2012/3/11

这很有用,因为您可以指定输入格式。 xx/yy/YY可以表示为i/n/Yn/i/Y,因此日期不明确=>不可预测的行为。

答案 1 :(得分:2)

如果你使用的是PHP> = 5.3.0,那么你需要确保获得正确的结果是DateTime::createFromFormat(),或者当你使用PHP> = 5.1.0时{}} strptime()可以指定输入格式。

虽然如果您仍然希望允许自由格式,那么您可能需要制作一个拐杖,这将使用正则表达式检查此特定格式,并将其中一个仅用于美国m / d / Y,例如:

function parsedate($date) {
    if (preg_match('#\d{1,2}/\d{1,2}/\d{2,4}#', $date)) {
        $parsed = strptime($date, '%m/%d/%Y');
        return mktime(0, 0, 0, $parsed['tm_mon'], $parsed['tm_mday'], 1900+$parsed['tm_year']);
            // 'tm_year' is years since 1900
    } else {
        return strtotime($date);
    }
}

它仍然是一个拐杖,但我看不到更清洁的方式。

答案 2 :(得分:0)

如果输入无效或格式错误,

strtotime()会产生意外结果。您的$_POST['toDate']似乎无法使strtotime正常运行。

您获得的日期是您所在时区的Unix Time的开始日期。

我建议使用strtotime之外的其他内容,例如DateTime类或date()函数。

答案 3 :(得分:0)

fromDate也是错误的,因为你希望03不是1月。

在你的情况下,strtotime认为输入是月/日/年,而15不是一个月它会搞砸。

您可以将输入字符串交换为

[fromDate] => 03/01/2012
[toDate] => 03/15/2012

或在@Vyktor的回答中使用createFromFormat。