mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-10-16 03:51:37 +00:00
Fixed timezone error caused by WMIC deprecation in new Windows (#6721)
Timezone information is now fetched from the registry instead of using WMIC
This commit is contained in:
@@ -26,9 +26,11 @@ namespace pocketmine\utils;
|
|||||||
use function abs;
|
use function abs;
|
||||||
use function date_default_timezone_set;
|
use function date_default_timezone_set;
|
||||||
use function date_parse;
|
use function date_parse;
|
||||||
|
use function escapeshellarg;
|
||||||
use function exec;
|
use function exec;
|
||||||
use function file_get_contents;
|
use function file_get_contents;
|
||||||
use function implode;
|
use function floor;
|
||||||
|
use function hexdec;
|
||||||
use function ini_get;
|
use function ini_get;
|
||||||
use function ini_set;
|
use function ini_set;
|
||||||
use function is_array;
|
use function is_array;
|
||||||
@@ -37,6 +39,7 @@ use function json_decode;
|
|||||||
use function parse_ini_file;
|
use function parse_ini_file;
|
||||||
use function preg_match;
|
use function preg_match;
|
||||||
use function readlink;
|
use function readlink;
|
||||||
|
use function sprintf;
|
||||||
use function str_contains;
|
use function str_contains;
|
||||||
use function str_replace;
|
use function str_replace;
|
||||||
use function str_starts_with;
|
use function str_starts_with;
|
||||||
@@ -105,40 +108,67 @@ abstract class Timezone{
|
|||||||
public static function detectSystemTimezone() : string|false{
|
public static function detectSystemTimezone() : string|false{
|
||||||
switch(Utils::getOS()){
|
switch(Utils::getOS()){
|
||||||
case Utils::OS_WINDOWS:
|
case Utils::OS_WINDOWS:
|
||||||
$regex = '/(UTC)(\+*\-*\d*\d*\:*\d*\d*)/';
|
$keyPath = 'HKLM\\SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation';
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* wmic timezone get Caption
|
* Get the timezone offset through the registry
|
||||||
* Get the timezone offset
|
|
||||||
*
|
*
|
||||||
* Sample Output var_dump
|
* Sample Output var_dump
|
||||||
* array(3) {
|
* array(13) {
|
||||||
* [0] =>
|
* [0]=>
|
||||||
* string(7) "Caption"
|
* string(0) ""
|
||||||
* [1] =>
|
* [1]=>
|
||||||
* string(20) "(UTC+09:30) Adelaide"
|
* string(71) "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation"
|
||||||
* [2] =>
|
* [2]=>
|
||||||
|
* string(35) " Bias REG_DWORD 0xfffffe20"
|
||||||
|
* [3]=>
|
||||||
|
* string(43) " DaylightBias REG_DWORD 0xffffffc4"
|
||||||
|
* [4]=>
|
||||||
|
* string(45) " DaylightName REG_SZ @tzres.dll,-571"
|
||||||
|
* [5]=>
|
||||||
|
* string(67) " DaylightStart REG_BINARY 00000000000000000000000000000000"
|
||||||
|
* [6]=>
|
||||||
|
* string(36) " StandardBias REG_DWORD 0x0"
|
||||||
|
* [7]=>
|
||||||
|
* string(45) " StandardName REG_SZ @tzres.dll,-572"
|
||||||
|
* [8]=>
|
||||||
|
* string(67) " StandardStart REG_BINARY 00000000000000000000000000000000"
|
||||||
|
* [9]=>
|
||||||
|
* string(52) " TimeZoneKeyName REG_SZ China Standard Time"
|
||||||
|
* [10]=>
|
||||||
|
* string(51) " DynamicDaylightTimeDisabled REG_DWORD 0x0"
|
||||||
|
* [11]=>
|
||||||
|
* string(45) " ActiveTimeBias REG_DWORD 0xfffffe20"
|
||||||
|
* [12]=>
|
||||||
* string(0) ""
|
* string(0) ""
|
||||||
* }
|
* }
|
||||||
*/
|
*/
|
||||||
exec("wmic timezone get Caption", $output);
|
exec("reg query " . escapeshellarg($keyPath), $output);
|
||||||
|
|
||||||
$string = trim(implode("\n", $output));
|
foreach($output as $line){
|
||||||
|
if(preg_match('/ActiveTimeBias\s+REG_DWORD\s+0x([0-9a-fA-F]+)/', $line, $matches) > 0){
|
||||||
|
$offsetMinutes = Binary::signInt((int) hexdec(trim($matches[1])));
|
||||||
|
|
||||||
//Detect the Time Zone string
|
if($offsetMinutes === 0){
|
||||||
preg_match($regex, $string, $matches);
|
|
||||||
|
|
||||||
if(!isset($matches[2])){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$offset = $matches[2];
|
|
||||||
|
|
||||||
if($offset === ""){
|
|
||||||
return "UTC";
|
return "UTC";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$sign = $offsetMinutes <= 0 ? '+' : '-'; //windows timezone + and - are opposite
|
||||||
|
$absMinutes = abs($offsetMinutes);
|
||||||
|
$hours = floor($absMinutes / 60);
|
||||||
|
$minutes = $absMinutes % 60;
|
||||||
|
|
||||||
|
$offset = sprintf(
|
||||||
|
"%s%02d:%02d",
|
||||||
|
$sign,
|
||||||
|
$hours,
|
||||||
|
$minutes
|
||||||
|
);
|
||||||
|
|
||||||
return self::parseOffset($offset);
|
return self::parseOffset($offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
case Utils::OS_LINUX:
|
case Utils::OS_LINUX:
|
||||||
// Ubuntu / Debian.
|
// Ubuntu / Debian.
|
||||||
$data = @file_get_contents('/etc/timezone');
|
$data = @file_get_contents('/etc/timezone');
|
||||||
|
Reference in New Issue
Block a user