0

UTC からのオフセットを分単位で保存しています: 例 -240

この特定のオフセットについて、現在の日の真夜中の対応する UNIX タイムスタンプを見つけようとしています。

次のような質問で同様の情報を見つけました:特定のタイムゾーンの「真夜中」の UTC 時刻を取得するにはどうすればよいですか?

ただし、都市名/タイムゾーンの管轄はありません。1分のオフセットだけです。私の目的では、夏時間を考慮に入れる必要がないので、これで問題ないと思います。1 時間ずれても問題ありません。

オフセット: -420

2014 年 7 月 12 日の深夜: 1405148400 (unix TS)

UTC では、TZ とは異なる「最後の午前 0 時」になる可能性があるため、最初に TZ の翌日か同じ日かを判断する必要があります。

4

3 に答える 3

1

このソリューションは少し醜く見えますが、あなたが求めていると思うことを実行します! この例では、オフセットとして -180 分を使用しています。

date_default_timezone_set('UTC');

// Work out which day the time zone is in
$day = strtotime('-180 minutes');

// Strip of the time part of the day, to give UTC midnight on the correct day
$utcMidnight = strtotime('midnight', $day);

// Now apply the offset in reverse to give the zone's midnight
$zoneMidnight = strtotime('+180 minutes', $utcMidnight);
于 2014-07-13T01:38:15.410 に答える
0

かなり考えなければなりませんでしたが、これが私が求めていた解決策だったと思います。このアルゴリズムが間違っていると思われる場合はお知らせください。

function getLastMidnightForOffset( $minuteOffset ) {
    $today = mktime( 0, 0, 0 );
    $tomorrow = $today + 86400;
    $yesterday = $today - 86400;
    $offset = $minuteOffset * 60;

    if ( time() + $offset >= $tomorrow ) {
        $localMidnight = $tomorrow - $offset;
    } elseif ( time() + $offset >= $today ) {
        $localMidnight = $today - $offset;
    } else {
        $localMidnight = $yesterday - $offset;
    }

    return $localMidnight;
}
于 2014-07-13T02:08:17.037 に答える
0

date_default_timezone_setすべての時間関連関数にシフトを認識させるために使用できます。UTC ギャップは n と n+1 の間で 1 時間であるため、最初に行うことは、これらの分を時間に変換することです。

$hours = $minutes / 60;

また、最初に分の値を確認することをお勧めします。

if($minutes % 60 == 0) // We're good.

ここで、UTC オフセットをタイムゾーンに変換する場合は、関数を作成できます。

<?php
function offsetToTimezone($offset){
    $timezones = array( 
        "-12" => "Pacific/Kwajalein", 
        "-11" => "Pacific/Samoa", 
        "-10" => "Pacific/Honolulu", 
        "-9" => "America/Juneau", 
        "-8" => "America/Los_Angeles", 
        "-7" => "America/Denver", 
        "-6" => "America/Mexico_City", 
        "-5" => "America/New_York", 
        "-4" => "America/Caracas", 
        "-3.5" => "America/St_Johns", 
        "-3" => "America/Argentina/Buenos_Aires", 
        "-2" => "Atlantic/Azores",
        "-1" => "Atlantic/Azores", 
        "0" => "Europe/London", 
        "1" => "Europe/Paris", 
        "2" => "Europe/Helsinki", 
        "3" => "Europe/Moscow", 
        "3.5" => "Asia/Tehran", 
        "4" => "Asia/Baku", 
        "4.5" => "Asia/Kabul", 
        "5" => "Asia/Karachi", 
        "5.5" => "Asia/Calcutta", 
        "6" => "Asia/Colombo", 
        "7" => "Asia/Bangkok", 
        "8" => "Asia/Singapore", 
        "9" => "Asia/Tokyo", 
        "9.5" => "Australia/Darwin", 
        "10" => "Pacific/Guam", 
        "11" => "Asia/Magadan", 
        "12" => "Asia/Kamchatka" 
    );

    return $timezones[$offset];
}
?>

...そして変換に if を使用します:

date_default_timezone_set(offsetToTimezone($hours));

ところで、この回答をご覧になることをお勧めします。これにより、の作業をよりエレガントに実現できoffsetToTimezoneます。

スクリプトが正しいタイムゾーンで構成されている場合は、タイムスタンプを要求するだけです:

$timestamp = mktime(0, 0, 0);

タイムゾーンをデフォルトにリセットする必要がある場合はdate_default_timezone_get、保存する必要がある場合があります。

$timezone = date_default_timezone_get();
// Change to another timezone based on your offset.
// Get your timestamp.
date_default_timezone_set($timezone);
于 2014-07-13T00:33:04.220 に答える