2

タイムゾーンから新しいタイムゾーンへの 12 時間形式の時刻の変換 でエラーが発生することがあります

エラー:

Fatal error: Uncaught exception 'Exception' with message 'DateTime::__construct(): Failed to parse time string (00:00:31 AM) at position 9 (A): The timezone could not be found in the database' in C:\xampp\php\udp.php:105
Stack trace:
#0 C:\xampp\php\udp.php(105): DateTime->__construct('00:00:31 AM', Object(DateTimeZone))
#1 {main}  thrown in C:\xampp\php\udp.php on line 105

マイコード:

// $gps_time = "9:43:52"; 
$gps_time      = $time_hour.":".$time_min.":".$time_sec;
// $time_received = "01:45:04 2012-07-28"; 
$time_received = date('H:i:s Y-m-d');

$utc = new DateTimeZone("UTC"); 
$moscow = new DateTimeZone("Europe/Moscow"); 

//Instantiate both AM and PM versions of your time 
$gps_time_am = new DateTime("$gps_time AM", $utc); 
$gps_time_pm = new DateTime("$gps_time PM", $utc); 

//Received time 
$time_received = new DateTime($time_received, $moscow); 

//Change timezone to Moscow 
$gps_time_am->setTimezone($moscow); 
$gps_time_pm->setTimezone($moscow); 

//Check the difference in hours. If it's less than 1 hour difference, it's the correct one. 
if ($time_received->diff($gps_time_pm)->h < 1) { 

$correct_time = $gps_time_pm->format("H:i:s Y-m-d");
} 
else { 

$correct_time = $gps_time_am->format("H:i:s Y-m-d");
}

echo $correct_time;

質問:どこに問題がありますか !!?
PS: 上記のコードは、私の udp ソケットの一部であり、php cli から実行されます

4

1 に答える 1

3

概要

簡単に言えば、そのPHPは(誤って、あなたのニーズのために)AMタイムゾーンとして読み取ろうとしてAMおり、有効なタイムゾーンではありません。


詳細

10:39:6 AM次の部分に分けられます

  • 10:39:6timelong24(秒付きの24時間形式の時間)として認識されます
  • AMtz(タイムゾーン)として認識されます。

対照的に、10:39:06 AM文字列全体をtimelong12(秒とAM / PMを含む12時間形式の時間)として正しく解析します。

退屈なビット

この奇妙な動作の理由は、日付解析ロジック(ソース)にあります。関連するパターンは次のとおりです。

timelong24

't'?
[01]?[0-9] | "2"[0-4]              # hour24
[:.]
[0-5]?[0-9]                        # minute
[:.]
[0-5]?[0-9] | "60"                 # second;

timelong12

"0"?[1-9] | "1"[0-2]               # hour12
[:.]
[0-5]?[0-9]                        # minute
[:.]
[0-5][0-9] | "60"                  # secondlz
[ \t]*                             # space?
([AaPp] "."? [Mm] "."?) [\000\t ]  # meridian;

ご覧のとおり、timelong12フォーマット(私たちが本当に望んでいたもの)と一致させるには、時間の部分が2桁である必要があります。

于 2012-07-28T15:28:29.583 に答える