PHP日期问题

发布于 2024-09-08 10:09:28 字数 273 浏览 4 评论 0 原文

我有 PHP 中的 Web 服务,它获取 dateTime 对象(来自 asp)。我想以我的自定义格式解析此日期。日期最初的格式为 "2010-07-05T00:00:00+02:00" 。当我尝试这样做时:

$oDate = strtotime($date_from_webservice);
$sDate = date("d.m.Y",$oDate);
echo $sDate;

我得到的日期是“07.04.2010”,比一天早。为什么?

谢谢

I have web service in PHP which gets dateTime object (from asp) . I want to parse this date in my custom format . The date originally is in format "2010-07-05T00:00:00+02:00" . When I'm trying this:

$oDate = strtotime($date_from_webservice);
$sDate = date("d.m.Y",$oDate);
echo $sDate;

I'm getting date "07.04.2010" which is one day earlier. Why?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

囍笑 2024-09-15 10:09:28

查看一下,原始日期($date_from_webservice)位于时区 GMT+2,时间为午夜。

我猜测 PHP 配置的时区不同(可能是 UTC),因此日期“看起来”是前一天。然而,转换是完全正确的。

要解决这个问题,您有几个选择:

  1. 要求/告诉源服务器将日期时间返回为 UTC(这才是它真正应该做的),确保 PHP 也使用 UTC。

  2. 使用 date_default_timezone_set 或在 php.ini 中。请注意,由于夏令时,您不能只添加/减去小时数。

  3. 如果您确定日期时间格式一致,请使用substr。例如:

    $sDate=substr($oDate, 8, 2).'.'.substr($oDate, 5, 2).'.'.substr($oDate, 0 ,4);

选项 1 是最好的。如果源服务器更改了时区,则选项 2 存在风险。选项 3 假设日期时间格式永远不会改变。

Looking at it, the original date ($date_from_webservice) is in the timezone GMT+2, and the time is midnight.

I'm guessing the timezone PHP is configured for is different (prob. UTC), so the date "appears" to be the day before. However, the conversion is perfectly correct.

To resolve this you have a couple of options:

  1. Ask/tell the origin server to return the datetime as UTC (which is what it should be doing really), make sure PHP is using UTC as well.

  2. Configure PHP to the same timezone as the source server, using date_default_timezone_set or in the php.ini. Note you can't just add/subtract hours, due to daylight savings.

  3. If you're sure the datetime format is consistent, use substr. Eg:

    $sDate=substr($oDate, 8, 2).'.'.substr($oDate, 5, 2).'.'.substr($oDate, 0 ,4);

Option 1 is the best. Option 2 is risky if the origin server has it's timezone changed. Option 3 assumes the datetime format will never change.

城歌 2024-09-15 10:09:28

因为您的时区偏移量小于 +2 小时。假设您在里斯本,当前时区偏移量为 UTC + 1 小时。那么该时间将是“2010-07-04T23:00:00+01:00”,即一天前。

您可以改用 DateTime

$date = new DateTime("2010-07-05T00:00:00+02:00");
echo $date->format("d.m.Y"); //echoes 05.07.2010

这会自动将时区“+02:00”与日期关联起来,确保格式正确。

另一方面:

$date = new DateTime("2010-07-05T00:00:00+02:00");
$date->setTimeZone(new DateTimezone("Europe/Lisbon"));
echo $date->format("d.m.Y"); //echoes 04.07.2010

Because your timezone offset is less than +2 hours. Let's say you're in Lisbon, where the current timezone offset is UTC + 1 hours. Then that time will be "2010-07-04T23:00:00+01:00", which is one day before.

You can use DateTime instead:

$date = new DateTime("2010-07-05T00:00:00+02:00");
echo $date->format("d.m.Y"); //echoes 05.07.2010

This automatically associates the timezone "+02:00" to the date, ensuring that the formatting is correct.

On the other hand:

$date = new DateTime("2010-07-05T00:00:00+02:00");
$date->setTimeZone(new DateTimezone("Europe/Lisbon"));
echo $date->format("d.m.Y"); //echoes 04.07.2010
迎风吟唱 2024-09-15 10:09:28

PHP 在格式化日期 字符串时使用(邪恶的)全局时区。您可以通过调用 date_default_timezone_set

$oDate = strtotime($date_from_webservice);

$oldTimezone = date_default_timezone_get();
date_default_timezone_set(date('e', $oDate));

$sDate = date('d.m.Y', $oDate);

date_default_timezone_set($oldTimezone);

echo $sDate;

PHP uses a (evil) global timezone when formatting date strings. You can use $oDate's timezone by calling date_default_timezone_set:

$oDate = strtotime($date_from_webservice);

$oldTimezone = date_default_timezone_get();
date_default_timezone_set(date('e', $oDate));

$sDate = date('d.m.Y', $oDate);

date_default_timezone_set($oldTimezone);

echo $sDate;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文