23

私は jquery daterangepickerを使用していますが、これは jQuery datapickerを使用しています。

私のUbuntuシステムは正常に動作します。ブラウザは解析可能な文字列を送信しています:

$dateStarted = new \DateTime($post['startDate']); // Thu Nov 15 2012 00:00:00 GMT-0700 (MST)
print_r($dateStarted);

出力:

DateTime Object
(
    [date] => 2012-11-15 00:00:00
    [timezone_type] => 1
    [timezone] => -07:00
)

テスターの Windows システムでは、ブラウザーは拡張されたタイムゾーンを文字列で送信しています。

$dateStarted = new \DateTime($post['startDate']); // Thu Nov 15 2012 00:00:00 GMT-0700 (Mountain Standard Time)
print_r($dateStarted);

スローと例外:

Exception: DateTime::__construct(): Failed to parse time string 
 (Thu Nov 15 2012 00:00:00 GMT-0700 (Mountain Standard Time)) 
 at position 41 (i): Double timezone specification

私はグーグルで検索しましたが、この特定の PHP エラーに関するリソースが見つかりません。

同じ結果を返す括弧付きのテキストを取り除くことで、この問題を「解決」しています。

$dateString = strstr($dateString, " (", true); // Thu Nov 15 2012 00:00:00 GMT-0700

これを行うのはかなり悪いようです。これを適切に行う方法についての提案を探しています。

4

3 に答える 3

28

MarcBが提案したようにDateTime::createFromFormat()を使用する方が良い解決策のようです。

私が最終的に得たものは次のとおりです。

$dateStarted = \DateTime::createFromFormat('D M d Y H:i:s e+', $post['startDate']); // Thu Nov 15 2012 00:00:00 GMT-0700 (Mountain Standard Time)
print_r($dateStarted);
print_r(\DateTime::getLastErrors());

今正しい日付を出力します:

DateTime Object
(
    [date] => 2012-11-15 00:00:00
    [timezone_type] => 1
    [timezone] => -07:00
)

Array
(
    [warning_count] => 1
    [warnings] => Array
        (
            [33] => Trailing data
        )

    [error_count] => 0
    [errors] => Array
        (
        )

)

フォーマットの+最後にあるのは、これを機能させる魔法です。

于 2012-11-16T20:55:57.710 に答える
6

これはバグだと思います。この文字列を使用すると、同じエラーが発生します

$dateStarted = new \DateTime("Thu Nov 15 2012 00:00:00 GMT-0700 (abcdefg)");

1つ少ない

$dateStarted = new \DateTime("Thu Nov 15 2012 00:00:00 GMT-0700 (abcdef)");

そしてそれは「適切に」解析されます。

タイムゾーン文字列は 6 文字に制限されているようです。Windows クライアントを構成することができ、その意志がない限り、「タイム ゾーン」を削除することが実行可能な「解決策」であると言えます。

于 2012-11-16T18:13:28.383 に答える