`IntlDateFormatter` returns wrong output for 1940 date in Amsterdam timezone
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- C
- Estrellas
- 40.4k
- Forks
- 8.2k
- Merge medio
- 2 d 13 h
- PR fusionados (30 d)
- 96
Descripción
Description
The following code:
<?php
$timezone = new DateTimeZone("Europe/Amsterdam");
$date = new DateTime("1940-01-01 00:00:00", $timezone);
var_dump($date);
$formatter = new IntlDateFormatter("en-US");
var_dump($formatter->format($date));
Resulted in this output:
object(DateTime)#2 (3) {
["date"]=>
string(26) "1940-01-01 00:00:00.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(16) "Europe/Amsterdam"
}
string(69) "Sunday, December 31, 1939 at 11:40:00 PM Coordinated Universal Time"
But I expected this output instead:
object(DateTime)#2 (3) {
["date"]=>
string(26) "1940-01-01 00:00:00.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(16) "Europe/Amsterdam"
}
string(48) "Monday, January 1, 1940 at 12:00:00 AM GMT+00:20"
Additional details
Until 16 May 1940, The Netherlands used UTC+00:20 as timezone. It looks like IntlDateFormatter is not aware of the UTC+00:20 timezone, so it outputs the date in UTC.
The occurrence of the problem seems related to the version of the ICU library:
| Environment | Source | PHP version | ICU version | Output |
|---|---|---|---|---|
| 3v4l.org | https://3v4l.org/UoVSs | 8.2.4 | 57.1 | ✅ As expected |
| Docker + Debian libicu | Dockerfile | 8.2.4 | 67.1 | ❌ Wrong |
| Docker + latest libicu | Dockerfile | 8.2.4 | 72.1 | ❌ Wrong |
I am not familiar enough with the ICU library to assess whether the problem originates there. Since the wrong output is present in PHP when using the latest versions (of PHP and the ICU library), I am submitting the bug here.
PHP Version
8.2.4
Operating System
No response
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza reproduciendo el ejemplo de IntlDateFormatter para Europe/Amsterdam y compara las versiones de ICU indicadas en el issue, usando los Dockerfiles de Debian y latest-ICU referenciados. Rastrea si el offset histórico incorrecto proviene de PHP o de ICU; se considera terminado cuando el formateador devuelve el resultado esperado de 1940 UTC+00:20 o el issue queda documentado como una limitación de ICU upstream.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- php
- Área
- internationalization
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 38/100