2010-10-11 64 views
32

Về cơ bản những gì tôi cần là tập lệnh, khi được cung cấp theo thời gian và múi giờ có thể trả về thời gian trong múi giờ khác.Chuyển đổi thời gian và ngày tháng từ múi giờ này sang múi giờ khác trong PHP

vấn đề chính của tôi là:

  • ở đâu để có được thời gian bù đắp từ giờ từ - là có một cơ sở dữ liệu nào có sẵn cho việc này?
  • Cách cũng xem xét sự khác nhau về thời gian tiết kiệm ánh sáng ban ngày (DST).
  • Làm thế nào để gói gọn nó trong lớp PHP - hoặc có sẵn một lớp học như vậy?

Trả lời

66
<?php 
$date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru')); 
echo $date->format('Y-m-d H:i:sP') . "\n"; 

$date->setTimezone(new DateTimeZone('Pacific/Chatham')); 
echo $date->format('Y-m-d H:i:sP') . "\n"; 
?> 

Những ví dụ trên sẽ đầu ra:

2000-01-01 00:00:00+12:00 
2000-01-01 01:45:00+13:45 

tìm thấy trên DateTime Manual on php.net

EDIT: Giống như Pekka nói: Lớp DateTime tồn tại từ 5.2 trên và có đầu tiên bạn phải tìm phương pháp nào được thực thi thực sự và phương thức nào chỉ tồn tại từ 5.3 trở lên.

+3

đánh bại tôi đến đấm, xóa tôi. Điều đáng nói đến là DateTime có sẵn từ PHP 5.2 - có bản vá cho 5.1 nhưng nó là thử nghiệm –

+0

Yep. datetime là khá "mới". Ngay cả trong 5.2 nó không chứa tất cả các chức năng cần thiết, mong muốn và được đề cập trong hướng dẫn sử dụng – ITroubs

+0

Câu trả lời hay. Các chức năng này cũng tự động xử lý việc tiết kiệm ánh sáng ban ngày, ở đây chỉ cần thêm một khoảng bù là clunky và không chính xác. –

-1

Ở đây tôi sử dụng hàm này để chuyển đổi datetime thành múi giờ khác. Để có kết quả tốt nhất nếu bạn chuyển đổi datetime của bạn thành múi giờ utc và sau đó chuyển đổi thành múi giờ yêu cầu thì đó là kết quả tốt hơn cho nó.

function ConvertTimezoneToAnotherTimezone($time, $currentTimezone, $timezoneRequired) { 
    $dayLightFlag = false; 
    $dayLgtSecCurrent = $dayLgtSecReq = 0; 
    $system_timezone = date_default_timezone_get(); 
    $local_timezone = $currentTimezone; 
    date_default_timezone_set($local_timezone); 
    $local = date("Y-m-d H:i:s"); 
    /* Uncomment if daylight is required */ 
    //  $daylight_flag = date("I", strtotime($time)); 
    //  if ($daylight_flag == 1) { 
    //   $dayLightFlag = true; 
    //   $dayLgtSecCurrent = -3600; 
    //  } 
    date_default_timezone_set("GMT"); 
    $gmt = date("Y-m-d H:i:s "); 

    $require_timezone = $timezoneRequired; 
    date_default_timezone_set($require_timezone); 
    $required = date("Y-m-d H:i:s "); 
    /* Uncomment if daylight is required */ 
    //  $daylight_flag = date("I", strtotime($time)); 
    //  if ($daylight_flag == 1) { 
    //   $dayLightFlag = true; 
    //   $dayLgtSecReq = +3600; 
    //  } 

    date_default_timezone_set($system_timezone); 

    $diff1 = (strtotime($gmt) - strtotime($local)); 
    $diff2 = (strtotime($required) - strtotime($gmt)); 

    $date = new DateTime($time); 

    $date->modify("+$diff1 seconds"); 
    $date->modify("+$diff2 seconds"); 

    if ($dayLightFlag) { 
     $final_diff = $dayLgtSecCurrent + $dayLgtSecReq; 
     $date->modify("$final_diff seconds"); 
    } 

    $timestamp = $date->format("Y-m-d H:i:s "); 

    return $timestamp; 
} 

Cảm ơn bạn.

3

thử này, nó có thể giúp :)

function converToTz($time="",$toTz='',$fromTz='') 
    { 
     // timezone by php friendly values 
     $date = new DateTime($time, new DateTimeZone($fromTz)); 
     $date->setTimezone(new DateTimeZone($toTz)); 
     $time= $date->format('Y-m-d H:i:s'); 
     return $time; 
    } 
Các vấn đề liên quan