2012-03-11 270 views
1

我得到的日期和日期使用jQuery的datepicker插件。以下是POST的输出。我很奇怪的strtotime行为

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已经改变了,你能帮我吗。

+0

strtotime有时表现出奇怪的行为..毕竟有这么多的日期时间格式。 mm/dd/yyyy,dd/mm/yyyy等,你能告诉我什么05/04/2012 vs 04/05/2012是?没有格式,你不能说出我在谈论哪个日期。你可能想尝试手动反编译你的日期格式,如果strtotime对你来说效果不好,比如我在这里:http://stackoverflow.com/questions/9568407/i-want-to-add-100-years-to-在显示的 - WordPress的-日期/ 9568726#9568726 – 2012-03-11 15:57:00

回答

0

strtotime()如果输入无效或格式错误,可能会给出意想不到的结果。看起来您的$_POST['toDate']strtotime无效,无法正常运行。

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

我会建议使用strtotime以外的东西,如DateTime类或date()函数。

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,因此日期不明确=>不可预知的行为。

2

如果您使用PHP> = 5.3.0或strptime()且PHP> = 5.1.0,您可以指定输入格式,则需要确保获得正确结果的是DateTime::createFromFormat()

但如果你仍然要允许自由格式那里,你可能想使一个拐杖,将与正则表达式检查这种特定的格式,并使用其中的一个仅适用于美国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); 
    } 
} 

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

0

没有fromdate也错了,因为你想03是一个月没有1

在你的情况的strtotime在想输入的是月/日/年和15月不就搅乱。

你既可以交换你的输入字符串

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

或@ Vyktor的答案使用createFromFormat。