PHP: 使用时区的DateTime::createFromFormat()函数

13

我想将日期格式从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');

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

3个回答

33

(PHP 5 ≥ 5.3.0)您实际上输入了第三个参数

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

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

9
我不知道为什么这个答案没有被选为解决方案。这是正确的答案。 - ofca
3
对我来说它不起作用。似乎第三个参数(“DateTimeZone”对象)被简单地忽略了。唯一的方法是使用@John Conde发布的经过验证的答案来实现这一点。我正在运行PHP 5.6.30版本。 - Delphine
1
如果您将$ tz设置为正确的时区,则此功能将按描述工作,但您必须手动执行此操作。 new \ DateTimeZone(date_default_timezone_get())设置系统默认值。 - j4k3
第三个参数完全没用。 - Kafoso
@Kafoso 只有当你的默认时区恰好是GMT时才可以。如果你在任何其他时区,那么指定时区绝对是必要的。 - j4k3

24

只需使用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 这样的时区无法工作。 - yoshi
1
看看这个答案是否满足你的需求:https://dev59.com/72w05IYBdhLWcg3wYwxs#7276486 - John Conde
只是为了澄清。这确实将一个日期(用户输入和用户的时区)转换为服务器时区。所以America/New_York是用户的时区? - yoshi
11
请注意,这个例子首先在服务器的时区中创建了$date,然后当调用setTimeZone()时,将其转换为“美国/纽约”的时区。换句话说,它引入了一个时间因素 - $date不再是午夜。对于某些人来说可能不是很重要,但对我来说很重要! - rinogo
可能最简单的方法是创建一个临时对象,然后基于该临时对象创建新对象。就像下面所描述的那样: $dateInServerTimeZone = DateTime::createFromFormat('d/m/Y', $dateString); $dateInWantedTimeZone = new DateTime($dateInServerTimeZone->format("Y-m-d H:i:s"), new DateTimeZone($createInZone)); 其中$createInZone是时区名称,例如"America/New_York"或"UTC"等。 - Aivar
这将把给定的日期时间转换为新时区,但这与最初在时区内创建给定日期不同。此答案将导致数字更改,因为它表示在不同时区内相同的日期时间。或者,在\ DateTime :: createFromFormat中指定时区作为参数不会更改数字,因为日期时间将首先在该时区内创建。哪个答案更好取决于您是想转换时区还是在时区内创建。 - kloddant

0
我测试了JohnConde和denoise的两种解决方案。
使用这个脚本:
$format = 'Y-m-d H:i:s';
$datetime_str = '2022-10-28 17:24:00';
$timezone_str = 'Europe/Rome';

$dt_test_denoise = DateTime::createFromFormat($format, $datetime_str, 
                                         new DateTimeZone($timezone_str));
echo '$dt_test_denoise:';
echo "<br/>";
var_dump($dt_test_denoise);
echo "<br/>";
echo "<br/>";

$dt_test_JohnConde = DateTime::createFromFormat($format, $datetime_str);
$dt_test_JohnConde->setTimeZone(new DateTimeZone($timezone_str));
echo '$dt_test_JohnConde:';
echo "<br/>";
var_dump($dt_test_JohnConde);
echo "<br/>";
echo "<br/>";

http://phptester.net/ 上执行此操作,您将看到差异。

我认为最好的解决方案是去噪!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接