2010-03-24 61 views

Trả lời

85

Bạn có thể sử dụng đối tượng datetime hoặc bí danh chức năng của họ cho việc này:

Example (abridged from PHP Manual)

date_default_timezone_set('Europe/London'); 

$datetime = new DateTime('2008-08-03 12:35:23'); 
echo $datetime->format('Y-m-d H:i:s') . "\n"; 
$la_time = new DateTimeZone('America/Los_Angeles'); 
$datetime->setTimezone($la_time); 
echo $datetime->format('Y-m-d H:i:s'); 

Chỉnh sửa về ý kiến ​​

nhưng tôi cannt sử dụng phương pháp này vì tôi cần hiển thị ngày ở các múi giờ khác nhau như chúng tôi đăng nhập er từ các vị trí khác nhau

Đó không phải là vấn đề. Khi người dùng đăng nhập, bạn xác định múi giờ của mình và đặt múi giờ đó thành đối tượng DateTime của bạn giống như được hiển thị. Tôi đang sử dụng một cách tiếp cận tương tự trong một trong các dự án của tôi và nó hoạt động như một sự quyến rũ.

trong cơ sở dữ liệu tôi cần để có được những ngày tháng trong bất kỳ múi giờ duy nhất, sau đó chỉ có thể được xử lý đúng cách

Bạn lưu trữ thời gian hoặc là một dấu thời gian hoặc một datetime trong một múi giờ. Khi bạn truy vấn trường DateTime, bạn chuyển đổi thời gian trong đối tượng DateTime thành múi giờ này hoặc - nếu db của bạn hỗ trợ nó - truy vấn với múi giờ đã chọn.

+0

nhờ Gordon nhưng tôi cannt sử dụng phương pháp này bởi vì tôi cần phải hiển thị ngày trong múi giờ khác nhau như người dùng đăng nhập từ các địa điểm khác nhau – raki

+0

@raki: vì vậy chỉ cần sau khi người dùng được đăng nhập - thiết lập date_default_timezone_set() với múi giờ đã chọn của người dùng thích hợp. – zerkms

+0

cũng không thể .. bởi vì .. trong cơ sở dữ liệu tôi cần để có được ngày trong bất kỳ múi giờ duy nhất, sau đó chỉ có nó có thể được xử lý đúng cách – raki

9

Một phương pháp đơn giản hơn thậm chí trông như thế này:

date_default_timezone_set('Europe/London'); // your user's timezone 
$my_datetime='2013-10-23 15:47:10'; 
echo date('Y-m-d H:i:s',strtotime("$my_datetime UTC")); 

Như đã trình bày in the PHP manual, strtotime() chấp nhận một múi giờ cũng vậy, bạn chỉ cần thêm nó vào datetime của bạn.

Tôi khuyên bạn nên lưu trữ tất cả thời gian biểu của bạn bằng UTC vì cách đó bạn sẽ không gặp vấn đề với tiết kiệm ban ngày.

9

Điều này phù hợp với tôi và nó cũng khá sạch sẽ!

function convert_to_user_date($date, $format = 'n/j/Y g:i A', $userTimeZone = 'America/Los_Angeles', $serverTimeZone = 'UTC') 
{ 
    try { 
     $dateTime = new DateTime ($date, new DateTimeZone($serverTimeZone)); 
     $dateTime->setTimezone(new DateTimeZone($userTimeZone)); 
     return $dateTime->format($format); 
    } catch (Exception $e) { 
     return ''; 
    } 
} 

function convert_to_server_date($date, $format = 'n/j/Y g:i A', $userTimeZone = 'America/Los_Angeles', $serverTimeZone = 'UTC') 
{ 
    try { 
     $dateTime = new DateTime ($date, new DateTimeZone($userTimeZone)); 
     $dateTime->setTimezone(new DateTimeZone($serverTimeZone)); 
     return $dateTime->format($format); 
    } catch (Exception $e) { 
     return ''; 
    } 
} 

//example usage 
$serverDate = $userDate = '2014-09-04 22:37:22'; 
echo convert_to_user_date($serverDate); 
echo convert_to_server_date($userDate); 
4

DateTime::setTimezone -- date_timezone_set — Sets the time zone for the DateTime object

hướng đối tượng phong cách

<?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"; 
?> 

phong cách thủ tục

<?php 
$date = date_create('2000-01-01', timezone_open('Pacific/Nauru')); 
echo date_format($date, 'Y-m-d H:i:sP') . "\n"; 

date_timezone_set($date, timezone_open('Pacific/Chatham')); 
echo date_format($date, 'Y-m-d H:i:sP') . "\n"; 
?> 

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

2000-01-01 00:00:00+12:00 
2000-01-01 01:45:00+13:45 
0
<?php 
$time='6:02'; 
$dt = new DateTime($time, new DateTimeZone('America/New_York')); 
//echo $dt->format('Y-m-d H:i:s') . PHP_EOL; 
$dt->setTimezone(new DateTimeZone('Asia/Kolkata')); 
echo $dt->format('H:i') . PHP_EOL; 
?> 
0

// Chuyển đổi ngày từ vùng này sang vùng khác .. /* $ zone_from = 'Asia/Kolkata';

$zone_to='America/Phoenix'; 

date_default_timezone_set($zone_from); 

$convert_date="2016-02-26 10:35:00"; 

echo $finalDate=zone_conversion_date($convert_date, $zone_from, $zone_to); 

*/ 
function zone_conversion_date($time, $cur_zone, $req_zone) 
{ 
    date_default_timezone_set("GMT"); 
    $gmt = date("Y-m-d H:i:s"); 

    date_default_timezone_set($cur_zone); 
    $local = date("Y-m-d H:i:s"); 

    date_default_timezone_set($req_zone); 
    $required = date("Y-m-d H:i:s"); 

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

    $date = new DateTime($time); 
    $date->modify("+$diff1 seconds"); 
    $date->modify("+$diff2 seconds"); 

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

UTC tới địa phương:

<?php 
$datetime = date("Y-m-d H:i:s"); 
$utc = new DateTime($datetime, new DateTimeZone('UTC')); 
$utc->setTimezone(new DateTimeZone('America/Sao_Paulo')); 
echo $utc->format('Y-m-d H:i:s'); 

?> 
4

Không ai trong số những câu trả lời làm việc cho tôi (tôi bỏ qua cố gắng mã mà là quá cồng kềnh trong kích thước). Tôi cũng nghĩ rằng thật kỳ lạ khi thay đổi múi giờ mặc định chỉ cho một chuyển đổi.

Đây là giải pháp của tôi:

function changeTimeZone($dateString, $timeZoneSource = null, $timeZoneTarget = null) 
{ 
    if (empty($timeZoneSource)) { 
    $timeZoneSource = date_default_timezone_get(); 
    } 
    if (empty($timeZoneTarget)) { 
    $timeZoneTarget = date_default_timezone_get(); 
    } 

    $dt = new DateTime($dateString, new DateTimeZone($timeZoneSource)); 
    $dt->setTimezone(new DateTimeZone($timeZoneTarget)); 

    return $dt->format("Y-m-d H:i:s"); 
} 

Vì vậy, để chuyển sang mặc định máy chủ, bạn sẽ chỉ cần vượt qua một múi giờ:

changeTimeZone("2016-10-24 16:28", "Asia/Tokyo"); 

Để chuyển đổi từ mặc định máy chủ cho người dùng, bạn sẽ để tham số thứ 2 null hoặc trống:

changeTimeZone("2016-10-24 16:28", "", "Asia/Tokyo"); 

Và để chuyển giữa các múi giờ lated để mặc định, bạn sẽ cung cấp 2 múi giờ:

changeTimeZone("2016-10-24 16:28", "America/New_York", "Asia/Tokyo"); 
+0

Dường như làm việc tuyệt vời! –

+1

Câu trả lời hay. Tôi thích thử bắt thay vì là (trống) để tránh bất kỳ lỗi chính tả trong chuỗi múi giờ. hãy thử { DateTimeZone mới ($ timeZoneSource); } \t bắt (Ngoại lệ $ e) { $ timeZoneSource = date_default_timezone_get(); } –

Các vấn đề liên quan