为什么这会破坏strtotime

时间:2014-08-19 09:32:58

标签: php

我在下面有这个代码并输出 1949年11月26日,但在strtotime运行时,它输出1970年的ephoc时间

$var = '26/11/1949';
echo $var;
$var = date("d/m/Y", strtotime($var));
echo $var;

更重要的是,如何在ephoc之前和之后获得重新排列的日期版本?

6 个答案:

答案 0 :(得分:1)

问题是26/11/1949不是strtotime()识别格式的日期。当日期的各个部分由/分隔时,它预计为m/d/Y,但26不是有效的月份数。

您应该使用Date::create_from_format,以便指定解析$var的方式:

$date = Date::create_from_format('d/m/Y', $var);

答案 1 :(得分:0)

由于:

unix时间戳是一种将时间跟踪为总运行秒数的方法。此计数始于1970年1月1日UTC时的Unix Epoch。因此,unix时间戳只是特定日期和Unix Epoch之间的秒数。还应该指出(感谢访问者对本网站的评论),无论您身在何处,这个时间点在技术上都不会改变。这对于在线和客户端的动态和分布式应用程序中跟踪和分类过时信息的计算机系统非常有用。

来源:http://www.unixtimestamp.com/index.php

答案 2 :(得分:0)

strtotime返回自纪元以来的秒数。但是来自文档:

  

此外,并非所有平台都支持负时间戳   你的日期范围可能不会早于Unix时代。这个   意味着,例如1970年1月1日之前的日期不适用于Windows,   一些Linux发行版和一些其他操作系统。 PHP 5.1.0   不过,新版本可以克服这个限制

如果您知道格式,我建议您使用该格式创建日期:

$var = '26/11/1949';
echo $var;
$date = DateTime::createFromFormat('d/m/Y');
$var = $date->format('d/m/Y');
echo $var;

答案 3 :(得分:0)

请参阅Date Formats

如果PHP在字符串中看到/,则假定美国格式日期为mm/dd/YYYY,而第26个月的第11天则无效

英国格式的日期需要-而不是/

$var = date("d/m/Y", strtotime(str_replace('/', '-',$var)));

但最好还是使用DateTime对象

答案 4 :(得分:0)

您获得1970年1月1日返回日期的原因是strtotime()失败并返回false,转换为1/1/1970第一个unix纪元日期。

这些问题都围绕着这样一个事实,即美国人因为某种晦涩的理由而开始约会一个月,然后是一天又一年。说话时听起来还不错,但它会使日期转换成为一场噩梦,因为计算机和世界其他地方使用更合理的y / m / d或d / m / y。因此,如果PHP在日期字符串中看到/,则认为它是一种美国日期格式。

因此,如果您使用

,日期转换将起作用
$var = '11/26/1949';
echo $var . PHP_EOL;
$var = date("d/m/Y", strtotime($var));
echo $var;

但幸运的是,如果您将分隔符转换为-而不是/

,它也会有效
$var = '26/11/1949';
echo $var . PHP_EOL;
$var = str_replace('/', '-', $var);
echo 'Converted date ' . $var . PHP_EOL;
$var = date("d/m/Y", strtotime($var));
echo $var;

答案 5 :(得分:0)

此处的问题是 strtotime()无法识别您的日期。

strtotime()可接受的日期格式列表列在PHP documentation中。很遗憾,您使用的格式 dd / mm / y 与此处列出的任何格式都不匹配。因此,如果您继续使用代码,则在大多数情况下您的数据转换都会出错。

我的建议是手动解析日期,使用mktime从中获取UNIX时间戳,然后使用date输出格式日期。如果您的脚本允许,您可以选择开始使用不同的 strtotime()友好日期格式。

我还建议使用DateTime()课程,特别是如果您计划对日期进行进一步操作。您可以使用DateTime::createFromFormat('d/m/Y')函数从字符串中获取DateTime对象。