【问题标题】:PHP: DateTime::createFromFormat() with timezonePHP:带时区的 DateTime::createFromFormat()
【发布时间】:2014-08-07 23:27:21
【问题描述】:

我想用时区偏移将日期形式从 d/m/Y 转换为 Y-m-d。 我可以使用以下代码从 d/m/Y 转换为 Y-m-d:

$date = DateTime::createFromFormat('d/m/Y', $date);
$date = $date->format('Y-m-d');

但我不确定如何添加时区偏移量。

【问题讨论】:

    标签: php datetime timezone timezone-offset


    【解决方案1】:

    (PHP 5 >= 5.3.0) 你居然输入了第三个参数

    public static DateTime DateTime::createFromFormat(string $format , 字符串 $time[, DateTimeZone $timezone])

    $date = DateTime::createFromFormat('d/m/Y', $date, new DateTimeZone('Europe/Berlin'));
    

    【讨论】:

    • 我不知道为什么这个答案没有被选为解决方案。这是正确的答案。
    • 它对我不起作用。似乎第三个参数(DateTimeZone Object)被忽略了。实现这一目标的唯一方法是使用@John Conde 发布的经过验证的答案,我正在运行 PHP 5.6.30
    • 如果您将 $tz 设置为正确的时区,这将按照描述的方式工作,但您必须手动进行。 new \DateTimeZone(date_default_timezone_get()) 设置系统默认值。
    • 第三个参数绝对是bipkis。
    • @Kafoso 仅当您的默认时区恰好是 GMT 时。如果您在任何其他时区,则绝对有必要指定它。
    【解决方案2】:

    只需使用DateTime::setTimeZone():

    $date = DateTime::createFromFormat('d/m/Y', $date);
    $date->setTimeZone(new DateTimeZone('America/New_York'));
    $date = $date->format('Y-m-d');
    

    【讨论】:

    • 我可以用+2:00代替America/New_York吗?我知道你应该使用时区而不是偏移量,因为夏令时等。但在这种环境下,America/New_York 这样的时区不起作用。
    • 看看this answer是否满足你的需要
    • 只是为了澄清。这确实将日期(用户输入和用户的时区)转换为服务器时区。那么America/New_York是用户的时区吗?
    • 请注意,此示例首先在服务器的时区中创建$date,然后在调用setTimeZone() 时,它会将其转换为“America/New_York”。换句话说,它引入了一个时间组件——$date 不再是午夜。对某些人来说可能没什么大不了的,但对我来说是!
    • 可能最简单的方法是创建临时对象,然后基于临时创建新对象。如下所述: $dateInServerTimeZone = DateTime::createFromFormat('d/m/Y', $dateString); $dateInWantedTimeZone = new DateTime($dateInServerTimeZone->format("Y-m-d H:i:s"), new DateTimeZone($createInZone));其中 $createInZone 是 timzone 名称示例“America/New_York”或“UTC”等
    猜你喜欢
    • 1970-01-01
    • 2017-11-01
    • 2012-04-24
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 2013-06-09
    相关资源
    最近更新 更多