指定された期間の2つのタイムゾーン間のタイムゾーンオフセットを取得する

私は、指定された期間の2つのタイムゾーン間の特定の日付範囲のタイムゾーンオフセットを取得する方法があるかどうかを知りたかった。

getTimezoneOffset(startDate,endDate,timezone1,timezone2){
    ...missing magic to go here...
}

指定された期間に有効なタイムゾーンオフセットを返す必要があります。ただし、オフセットが変更された場合は、有効な日付範囲が返されます。

だから私はこのような何かを見ている:

getTimezoneOFfset("march 9 12 am", "march 15 12 am", "UTC", "US/NEW_YORK")

このような戻り値

timezoneoffset[0]["range"]=[march 9 12am to march 11 2 am]
timezoneoffset[0]["offset"]=5
timezoneoffset[1]["range"]=[march 9 2 am to march 15 12 am]
timezoneoffset[1]["offset"]=4

私はちょうど与えられた範囲の予定された項目ごとにタイムゾーンのオフセットを計算したくありません。それが変更される場合、オフセットを直接検索する方法があるかどうかを調べていました。

私はPHPを使って作業していますが、どの言語のソリューションも高く評価されます。

MySQLでこれを行うためにより最適化されるように、MySQLのソリューションも動作します。

5

3 答え

新しいバージョンのphp(5.2.0+)があると仮定すると、 DateTimeZone < a>クラスはPHPコアの一部であり、これらの計算を行うには getOffset()関数を使用できます。 dateTimeオブジェクトを渡し、タイムゾーンを指定します。両方の日付でこれを行う場合、取得しようとしているすべてのピースを計算できるはずです。 php.netの例を使用するには:

// Create two timezone objects, one for Taipei (Taiwan) and one for
// Tokyo (Japan)
$dateTimeZoneTaipei = new DateTimeZone("Asia/Taipei");
$dateTimeZoneJapan = new DateTimeZone("Asia/Tokyo");

// Create two DateTime objects that will contain the same Unix timestamp, but
// have different timezones attached to them.
$dateTimeTaipei = new DateTime(mktime([the date in question]), $dateTimeZoneTaipei);
$dateTimeJapan = new DateTime(mktime([the date in question]), $dateTimeZoneJapan);


// Calculate the GMT offset for the date/time contained in the $dateTimeTaipei
// object, but using the timezone rules as defined for Tokyo
// ($dateTimeZoneJapan).
$timeOffset = $dateTimeZoneJapan->getOffset($dateTimeTaipei);

// Should show int(32400) (for dates after Sat Sep 8 01:00:00 1951 JST).
print("Number of seconds Japan is ahead of GMT at the specific time: ");
var_dump($timeOffset);

print("
Number of seconds Taipei is ahead of GMT at the specific time: "); var_dump($dateTimeZoneTaipei->getOffset($dateTimeTaipei)); print("
Number of seconds Japan is ahead of Taipei at the specific time: "); var_dump($dateTimeZoneJapan->getOffset($dateTimeTaipei) -$dateTimeZoneTaipei->getOffset($dateTimeTaipei));
3
追加された
getOffsetは指定された時間だけのオフセットを与えますが、毎回それを計算するのは何が悪いですか?あなたはstart datetimeとend datetimeを指定します...開始時刻のオフセットと終了時刻のオフセットを把握し、違いがあれば違いを考慮してください...関数を書くのは難しいはずはありません getOffset に基づいて getTimezoneOffset(startDate、endDate、timezone1、timezone2)
追加された 著者 Ben D,
私はオフセットを取得することについて知っている..しかし、オフセットを取得するだけで、一定時間のためのオフセットを与える..それは私が日中に異なる時間のスケジュールアイテムのスケジュールとスケジュールを持っている..
追加された 著者 user1192612,
だから、もし私が10月3日の午後9時から午後9時までの間に予定項目を取得する要求を得るならば、オフセットはthtの持続時間の間変化するだろう。私は毎回オフセットを計算することはできない。 。異なる国では、オフセットが変更されたときの日が異なるでしょう。そして、UTCではなく、2つのタイムゾーンの間のオフセットを見つけることを試みています。開始時間に基づいてオフセットを計算すると、問題はありません。それは全体を通して同じだろう。私はPHPが一定の時間のオフセットをggives Uに与えると思う..私は自分自身を明確にしたいと思う
追加された 著者 user1192612,
ボトムラインは、オフセットが1日中に変わるかもしれないと仮定しなければならない11月12日11時12分(オフセットは2時に変化する)..このコーナーケースをカバーしようとしている
追加された 著者 user1192612,
オフセットが変化したときはわからないgetTransitionsは私が探していたものです!オフセットは一定の期間にわたって複数回変化する可能性があるため、開始時のオフセットは終了時のオフセットと同じになる可能性がありますが、オフセットが一定の期間にわたって同じであることを保証します。期間はオフセットが変わります!
追加された 著者 user1192612,

PHPの DateTimeZone :: getTransitions メソッドと思うそこに行くことができます。プロシージャー別名 timezone_transitions_get()があります。

public array DateTimeZone::getTransitions (
    [ int $timestamp_begin [, int $timestamp_end ]]    )

このメソッドは、指定された時間範囲内で、そのタイムゾーンの1つのタイムゾーンオフセット値から別のタイムゾーンオフセット値へのすべての「遷移」を返します。

目的のために、タイムゾーンごとに DateTimeZone オブジェクトを作成し、その期間のトランジションの配列を取得するために日付範囲の DateTimeZone :: getTransitions をコールします2つのトランジションの配列をマージしソートします。これは、あなたが求める timezoneoffset [] 配列に相当します。

何かのようなもの:

getTimezoneOffset(startDate,endDate,timezone1,timezone2){
    DT1 = DateTimeZone( timezone1 );
    transitions1 = DT1->getTransitions( startDate,endDate );
    DT2 = DateTimeZone( timezone2 );
    transitions1 = DT2->getTransitions( startDate,endDate );
    timezoneoffset[] =//merge and sort (transitions1, transitions2)
}

トランジション配列の形式は十分に文書化されていません。メソッドのドキュメントでは、いくつかのエントリの例を示します:

Array
(
...
    [1] => Array
        (
            [ts] => -1691964000
            [time] => 1916-05-21T02:00:00+0000
            [offset] => 3600
            [isdst] => 1
            [abbr] => BST
        )

    [2] => Array
        (
            [ts] => -1680472800
            [time] => 1916-10-01T02:00:00+0000
            [offset] => 0
            [isdst] => 
            [abbr] => GMT
        )
    ...
)

私は推測します: ts は、 time()で返された時の秒単位のPHPタイムスタンプを参照しています。記録。 time は、フォーマットされた文字列の日付時刻と同じ瞬間を参照します。 offset は、瞬時の time / ts 現在のUTCからのタイムゾーンのオフセット(秒)です。 isdst は、オフセットが夏時間オフセットを参照する場合は1、それ以外の場合は0です。 abbr は、タイムゾーンの文字列省略形です。もし誰かがこのデータ構造について確かな情報を持っていれば、それをドキュメントを参照してください。

1
追加された
ありがとうJim ..正確に私が探していたもの...私はdatetimeオブジェクトを通過しましたが、これは見落とされました。
追加された 著者 user1192612,

これは私のために働く:

function Get_Timezone_Offset($remote_tz, $origin_tz = null) 
{
    if($origin_tz === null) 
    {
        if(!is_string($origin_tz = date_default_timezone_get())) {
            return false;
        }
    }
    $origin_dtz = new DateTimeZone($origin_tz);
    $remote_dtz = new DateTimeZone($remote_tz);
    $origin_dt  = new DateTime("now", $origin_dtz);
    $remote_dt  = new DateTime("now", $remote_dtz);
    $offset     = $origin_dtz->getOffset($origin_dt) - $remote_dtz->getOffset($remote_dt);
    return $offset;
}

それを使用するには

echo Get_Timezone_Offset('America/New_York', 'Europe/Stockholm');

Source: http://php.net/manual/en/function.timezone-offset-get.php

0
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com