PHP tarih fonksiyonu timezone değişikliği kabul etmiyor

2 Cevap php

Ben anlamak ve MySQL ve PHP arasındaki hata ayıklama dilimleri hızlı bir küçük bir test kurdum.

İşte sayfası: http://dev.feedingo.com/test_dates.php

Tarihleri ​​bir datetime alanına NOW () kullanılarak mySQL oluşturulmaktadır. Ben anlamaya çalışıyordum ilk sorun MySQL kullanarak ve nasıl PHP ile eşitlemek için ne timezone. Ama şimdi daha da garip bir sorun var.

Bir tarih () fonksiyonu içine geçerse benim test uygulaması, sizin dilimini değiştirirseniz, ilk strtotime güncellemeleri düzgün, ama o değişmez. Bu dilimini ayarlama im seçme kutusunu kapalı tabanlı nasıl.

    $current_timezone = 'America/New_York';
if( isset( $_GET['timezone'] ) ) $current_timezone = $_GET['timezone'];

date_default_timezone_set($current_timezone);

Herhangi bir tarih () işlevi dilimi değişiklikleri kabul etmiyor neden olarak fikir? Teşekkürler!

2 Cevap

Date () fonksiyonu düzgün çalışıyor.

varsayılan zaman dilimi de strtotime etkiler.

Eğer dilimini değiştirdiğinizde, değiştiren tablodaki tek sütun damgası sütun olduğuna dikkat edin.

Ben UTC öneriyoruz içeri mysql faaliyet dilimini belirlemek (veya set) gerekir.

Sonra aşağıdakilerden birini deneyin:

  1. When you pull a date from mysql, either date_default_timezone_set('UTC') before calling strtotime(), and then set it back to the user preference before calling date
  2. Geri mysql almak tarih dize bir zaman dilimi bölümünü eklemeyi deneyin:

    //since we added a timezone part, this will be 20:14:01 in UTC. $actualTime = strtotime($strDate);

İşte aydınlatmak yardımcı olabilecek küçük bir demo senaryo:

<?PHP
date_default_timezone_set('America/New_York');
$date = '2010-05-22 20:14:01'; //assume it's from mySQL, which is operating in UTC

echo strtotime($date) . ' ' . date('H:i:s', strtotime($date));
echo "\n";
echo strtotime($date.' -0000') . ' ' . date('H:i:s', strtotime($date . ' -0000'));
echo "\n";

Çıktı gibi görünüyor:

1274573641 20:14:01
1274559241 16:14:01

(Bu varsayılan beri) ilk satır strtotime America / New_York faaliyet vardır.

İkinci satır strtotime için giriş belirlenen açık bir zaman dilimini vardır.

Bu deneyin. Benim için onun iş.

<?php
$time=39600;
$datetime = strtotime(date("h:i:s A"))+$time;
$datetime = date('D, d M', $datetime);
echo $datetime;

// $time obtained from table below:
//  -25200|International Date Line (West) GMT-12|
//  -21600|Midway Island, Samoa GMT-11|
//  -18000|Hawaii, Honolulu GMT-10|
//  -14400|Alaska GMT-9|
//  -10800|Pacific Standard Time, US, Canada GMT-8|
//  -7200|British Columbia N.E., Santa Fe, Mountain Time GMT-7|
//  -3600|Central America, Chicago, Guatamala, Mexico City GMT-6|
//  0|US, Canada, Bogota, Boston, New York GMT-5|
//  +3600|Canada, Santiago, Atlantic Standard Time GMT-4|
//  +7200|Brazilia, Buenos Aires, Georgetown, Greenland GMT-3|
//  +10800|Mid-Atlantic GMT-2|
//  +14400|Azores, Cape Verde Is., Western Africa Time GMT-1|
//  +18000|London, Iceland, Ireland, Morocco, Portugal GMT|
//  +21600|Amsterdam, Berlin, Bern, Madrid, Paris, Rome, GMT+1|
//  +25200|Athens, Cairo, Cape Town, Finland, Greece, Israel GMT+2|
//  +28800|Ankara, Aden, Baghdad, Beruit, Kuwait, Moscow GMT+3|
//  +32400|Abu Dhabi, Baku, Kabul, Tehran, Tbilisi, Volgograd GMT+4|
//  +36000|Calcutta, Colombo, Islamabad, Madras, New Dehli GMT+5|
//  +39600|Almaty, Dhakar, Kathmandu, Colombo, Sri Lanka GMT+6|
//  +43200|Bangkok, Hanoi, Jakarta, Phnom Penh, Australia GMT+7|
//  +46800|Taipei, Beijing, Hong Kong, Singapore, GMT+8|
//  +50400|Seoul, Tokyo, Central Australia GMT+9|
//  +54000|Brisbane, Canberra, Guam, Melbourne, Sydney, GMT+10|
//  +57600|Magadan, New Caledonia, Solomon Is. GMT+11|
//  +61200|Auckland, Fiji, Kamchatka, Marshall, Wellington, GMT+12|
?>