繁体   English   中英

具有欧洲日期格式的 Strtotime

[英]Strtotime with European date format

我正在尝试使用 strtotime 转换以下日期:

2009 年 7 月 9 日 17:01:27

这是 9 月 7 日的欧洲/伦敦时区格式

该功能正在反转月份和日期,有什么解决方法吗? 谢谢

更改/- ,似乎 PHP 将/作为美国格式,而-作为欧洲格式。 你可以在这里看到:

$date = "06/10/2011 14:28"; // 6 october 2011 2:28 pm
$otherDate = "06-10-2011 14:28"; // 6 october 2011 2:28 pm

echo $stamp = strtotime($date) . "<br />"; // outputs 1307708880
echo $otherStamp = strtotime($otherDate) . "<br />"; // outputs 1317904080

echo date("d-m", $stamp); // outputs 10-06
echo date("d-m", $otherStamp); // outputs 06-10

http://www.php.net/manual/es/function.strtotime.php#106043

如果您不在 Windows 上,则可以使用strptime代替,并明确设置格式。 正如 OIS 指出的那样, strptime在 Windows 上不可用。

要将拆分的年/月/日等值转换为 unix 时间戳,您可以将它们传递到mktime 有点繁琐,但它有效。

您可能想要这样做的一个原因是使用date以不同的格式打印它。

从 strptime php.net 页面:

Example #1 strptime() 例子

<?php $format = '%d/%m/%Y %H:%M:%S'; $strf = strftime($format); echo "$strf\n"; print_r(strptime($strf, $format)); ?>

上面的示例将输出类似于:

2004 年 3 月 10 日 15:54:19

 Array ( [tm_sec] => 19 [tm_min] => 54 [tm_hour] => 15 [tm_mday] => 3 [tm_mon] => 9 [tm_year] => 104 [tm_wday] => 0 [tm_yday] => 276 [unparsed] => )

DateTime可以轻松处理这个问题:

$datetime = new DateTime('07/09/2009 17:01:27', new DateTimeZone('Europe/London'));
echo $datetime->format('d/m/Y H:i:s');

看到它在行动

尝试:

strtotime(07/09/2009 17:01:27 GMT);

或者先试试这个:

date_default_timezone_set('Europe/London');

我想最好的答案是不要使用 strtotime ,因为它的准确性永远不可能是 100%

这是一个应该有效的快速修复。 另一种方法是使用命名匹配的正则表达式。

function eurototime($string)
{
    static $sorted = array(
        'tm_hour' => null,
        'tm_min' => null,
        'tm_sec' => null,
        'tm_mon' => null,
        'tm_mday' => null,
        'tm_year'  => null,
    );
    static $unsorted = array(
        'tm_mday',
        'tm_mon',
        'tm_year',
        'tm_hour',
        'tm_min',
        'tm_sec',

    );
    static $format = '%d/%d/%d %d:%d:%d';
    $parsed = sscanf($string, $format);
    $data = array_combine($unsorted, $parsed);
    $sortedData = array_merge($sorted, $data);
    $int = call_user_func_array('mktime', $sortedData);
    return $int;
}

date_default_timezone_set('Europe/London');
echo eurototime(date('d/m/Y H:i:s')), "\n", time(),"\n";

我写这篇文章时的最佳答案建议使用破折号,但对于任何寻找更清洁的东西的人来说,都不需要以特定方式设置面向用户的日期或进行手动字符串编辑,我建议使用日期时间::createFromFormat

$dateObject = DateTime::createFromFormat('d/m/Y H:i:s', '07/09/2009 17:01:27');
echo $dateObject->format('Y-m-d');

我绝对建议您阅读该功能的文档,但它有很多可能会导致您的用例出现问题的边缘案例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM