Ich glaube ja, dass das Problem darin besteht, dass PHP für Server gemacht wurde (→ Zeitzone zumeist UTC) während JS/ECMA eigentlich für Browser gedacht istwar (→ Zeitzone des jeweiligen Benutzers). Daraus ergeben sich unterschiedliche Ansätze, betreffend der „Einfachheit der Beachtung der Zeitzonen“…
Deshalb habe ich mal was konstruiert:
<?php
function getDatePartsUTC( DateTime $dt ) {
$arr = getdate(
$dt -> getTimestamp() + $dt -> getOffset()
);
# Only to make the array full compatible to getDatePartsLocal():
$arr['TimezoneName'] = 'UTC';
$arr['TimezoneOffset'] = '00:00';
$arr['TimezoneOffsetS'] = 0;
return $arr;
}
function getDatePartsLocal( DateTime $dt, $TimeZoneName ) {
$dt -> setTimezone(
new DateTimeZone( $TimeZoneName )
);
$arr = getdate(
$dt -> getTimestamp() + $dt -> getOffset()
);
$arr['TimezoneName'] = $TimeZoneName ;
$arr['TimezoneOffset'] = $dt -> format('P');
$arr['TimezoneOffsetS'] = (int)$dt -> format('Z');
return $arr;
}
$now = new DateTime();
#var_dump( $now );
echo "Stunde in UTC:" . PHP_EOL;
#var_dump( getDatePartsUTC( $now ) );
$a = getDatePartsUTC( $now );
echo $a['hours'] . PHP_EOL;
### Show:
### https://www.php.net/manual/de/timezones.php
### https://raw.githubusercontent.com/leon-do/Timezones/main/timezone.json
$zones = [
'Europe/Moscow',
'Europe/Berlin',
'Europe/Lisbon',
'UTC'
];
foreach ( $zones as $zone ) {
echo "\nStunde für: $zone" . PHP_EOL;
#var_dump( getDatePartsLocal( $now, $zone ) );
$a = getDatePartsLocal( $now, $zone );
echo $a['hours'] . PHP_EOL;
}
Ausgaben auf Rechner mit Default-Zeitzone UTC (Server):
fastix@raspi4:/tmp $ php test.php
Stunde in UTC:
8
Stunde für: Europe/Moscow
11
Stunde für: Europe/Berlin
10
Stunde für: Europe/Lisbon
9
Stunde für: UTC
8
Ausgaben auf Rechner mit Default-Zeitzone Europe/Berlin (Desktop):
fastix@mini:/tmp$ php test.php
Stunde in UTC:
8
Stunde für: Europe/Moscow
11
Stunde für: Europe/Berlin
10
Stunde für: Europe/Lisbon
9
Stunde für: UTC
8
[x] sind identisch. Scheint zu funktioneren.