php / php/php-src

IntlDateFormatter::localtime() unexpectedly causes time zone to be changed if specified

オープン
#13,766 コメント 4 件 リアクション 0 件 担当者 1 名 GitHub で見る

@devnexen がすでに取り組んでいます。

2024年3月20日 から。

Extension: intl Feature Status: Needs Triage
主要言語
C
スター
40.4k
フォーク
8.2k
平均マージ
2日 13時間
マージ済み PR(30日)
96

説明

Description

The following code:

<?php

$oIntlDateFormatter = new IntlDateFormatter("en_GB");
$oIntlDateFormatter->setTimeZone('Europe/Berlin');
$oIntlDateFormatter->setPattern('VV');

$oIntlDateFormatter->parse('America/Los_Angeles', $offsetResult);
var_dump($oIntlDateFormatter->getTimeZone()->getID());

$oIntlDateFormatter->localtime('America/Los_Angeles');
var_dump($oIntlDateFormatter->getTimeZone()->getID());

Resulted in this output:

string(13) "Europe/Berlin"
string(19) "America/Los_Angeles"

But I expected this output instead:
Either:

string(13) "Europe/Berlin"
string(13) "Europe/Berlin"

Or

string(19) "America/Los_Angeles"
string(19) "America/Los_Angeles"

IntlDateFormatter should either consistently keep the originally set time zone or consistently overwrite the time zone whenever different time zone data is supplied.

IntlDateFormatter::localtime() causes the time zone within an IntlDateFormatter object to be changed, if a time zone was provided in the used date/time pattern. This is nowhere mentioned in the documentation of IntlDateFormatter::localtime() and in contrast IntlDateFormatter::parse() does not behave this way. This is why I think the behaviour of IntlDateFormatter::localtime() is not intentional.

In contrast when I look at DateTime::createFromFormat(), a time zone supplied in the $datetime parameter consistently overrides a supplied $timezone parameter.

Having looked a bit into PHPs code, It seems like DateTime::createFromFormat() and internally always generates a field-based time value and generates a date/time representation from that, just like IntlDateFormatter::localtime(). So this may be also triggering the change of the time zone.
IntlDateFormatter::parse() on the other hand appears to to only call into the ICU library to get a parse the supplied date/time string.

PHP Version

PHP 8.3.4

Operating System

Ubuntu 22.04.1

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

評価

この issue はまだ評価されていません。

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。