使用 ics 日期/时间格式在 php 中管理时区

发布于 2024-08-28 10:58:58 字数 346 浏览 7 评论 0原文

好的,我正在使用 ICS 解析器实用程序来解析 Google 日历 ICS 文件。它工作得很好,除了谷歌给我提供了 UCT 的活动时间。所以我现在需要减去 5 小时,夏令时发生时需要减去 6 小时。

为了获取我正在使用的开始时间:

$timestart = date("g:iA",strtotime(substr($event['DTSTART'], 9, -3)));
//$event['DTSTART'] feeds me back the date in ICS format: 20100406T200000Z

那么,对于如何处理时区和夏令时有什么建议吗?

提前致谢

Ok, I'm using an ICS parser utility to parse google calendar ICS files. It works great, except google is feeding me the times of the events at UCT.. so I need to subtract 5 hours now, and 6 hours when daylight savings happens.

To get the start time I'm using:

$timestart = date("g:iA",strtotime(substr($event['DTSTART'], 9, -3)));
//$event['DTSTART'] feeds me back the date in ICS format: 20100406T200000Z

So any suggestions how to handle timezone and daylight savings time?

Thanks in advance

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

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

发布评论

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

评论(2

油焖大侠 2024-09-04 10:58:58

只是不要使用代码的 substr() 部分。 strtotime 能够解析 yyyymmddThhiissZ 格式的字符串并将 Z 解释为 timezone=utc。

例如

$event = array('DTSTART'=>'20100406T200000Z');
$ts = strtotime($event['DTSTART']);

date_default_timezone_set('Europe/Berlin');
echo date(DateTime::RFC1123, $ts), "\n";

date_default_timezone_set('America/New_York');
echo date(DateTime::RFC1123, $ts), "\n";

打印

Tue, 06 Apr 2010 22:00:00 +0200
Tue, 06 Apr 2010 16:00:00 -0400

编辑:或使用 DateTime 和 DateTimezone 类

$event = array('DTSTART'=>'20100406T200000Z');
$dt = new DateTime($event['DTSTART']);

$dt->setTimeZone( new DateTimezone('Europe/Berlin') );
echo $dt->format(DateTime::RFC1123), "\n";

$dt->setTimeZone( new DateTimezone('America/New_York') );
echo $dt->format(DateTime::RFC1123), "\n";

(输出相同)

Just don't use the substr() part of the code. strtotime is able to parse the yyyymmddThhiissZ formatted string and interprets the Z as timezone=utc.

e.g.

$event = array('DTSTART'=>'20100406T200000Z');
$ts = strtotime($event['DTSTART']);

date_default_timezone_set('Europe/Berlin');
echo date(DateTime::RFC1123, $ts), "\n";

date_default_timezone_set('America/New_York');
echo date(DateTime::RFC1123, $ts), "\n";

prints

Tue, 06 Apr 2010 22:00:00 +0200
Tue, 06 Apr 2010 16:00:00 -0400

edit: or use the DateTime and DateTimezone classes

$event = array('DTSTART'=>'20100406T200000Z');
$dt = new DateTime($event['DTSTART']);

$dt->setTimeZone( new DateTimezone('Europe/Berlin') );
echo $dt->format(DateTime::RFC1123), "\n";

$dt->setTimeZone( new DateTimezone('America/New_York') );
echo $dt->format(DateTime::RFC1123), "\n";

(output is the same)

鹊巢 2024-09-04 10:58:58

如果您已经设置了时区区域设置,您还可以使用 date("T") 它将返回当前时区。

echo date("T");

因为我们处于夏令时,(在我的时区)它返回:
EDT

然后您可以在 IF 语句中使用它来调整时区调整。

if (date("T") == 'EDT')
  $adjust = 6;
else
  $adjust = 5;

If you've set your timezone locale, you can also then use date("T") which will return the current timezone.

echo date("T");

Because we're in Daylight Saving Time, (in my timezone) it returns:
EDT

Then you could use that in an IF statement to adjust your timezone adjustment.

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