Raketenwilli: Und jetzt für verschiedene Zeitzonen ...

Beitrag lesen

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.