2011-11-04 34 views

Trả lời

36

Đặt múi giờ mặc định đầu tiên và nhận được ngày sau đó, ngày sẽ theo múi giờ bạn chỉ định:

<?php 
date_default_timezone_set('America/New_York'); 
$date= date('m-d-Y') ; 
?> 

http://php.net/manual/en/function.date-default-timezone-set.php

+6

Lưu ý rằng sử dụng 'date_default_timezone_set()' đặt nó cho tất cả việc sử dụng của 'date()' sau thời điểm đó. Xem câu trả lời của tôi cho một ví dụ về cách quản lý nhiều múi giờ. – DesignerGuy

+5

Thực tiễn không tốt nếu bạn chỉ muốn nhận được 1 ngày trong múi giờ đó, xem câu trả lời của DesignerGuy bên dưới để biết thêm giải pháp. –

+0

Sẽ rất hay khi có cách chung để chọn múi giờ. – Zan

-1
<?php 
date_default_timezone_set('GMT-5');//Set New York timezone 
$today = date("F j, Y") 
?> 
3

Nếu bạn có quyền truy cập vào PHP 5.3, intl extension rất tốt khi thực hiện những việc như thế này.

Dưới đây là một ví dụ từ hướng dẫn:

$fmt = new IntlDateFormatter("en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL, 
    'America/Los_Angeles',IntlDateFormatter::GREGORIAN ); 
$fmt->format(0); //0 for current time/date 

Trong trường hợp của bạn, bạn có thể làm:

$fmt = new IntlDateFormatter("en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL, 
     'America/New_York'); 
$fmt->format($datetime); //where $datetime may be a DateTime object, an integer representing a Unix timestamp value (seconds since epoch, UTC) or an array in the format output by localtime(). 

Như bạn có thể đặt múi giờ như America/New_York, điều này là tốt hơn nhiều so với sử dụng một Tính toán bù trừ GMT hoặc UTC, vì điều này cũng tính đến thời gian tiết kiệm ánh sáng ban ngày.

Cuối cùng, vì tiện ích mở rộng intl sử dụng dữ liệu ICU, chứa nhiều tính năng rất hữu ích khi tạo định dạng ngày/giờ của riêng bạn.

94

Những câu trả lời khác thiết lập múi giờ cho tất cả các ngày trong bạn hệ thống. Điều này không phải lúc nào cũng hoạt động tốt nếu bạn muốn hỗ trợ nhiều múi giờ cho người dùng của mình.

Đây là phiên bản ngắn:

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

trình trong PHP> = 5.2.0

Danh sách các múi giờ được hỗ trợ: php.net/manual/en/timezones.php


Dưới đây là một phiên bản với thời gian hiện tại và thiết lập múi giờ do người dùng đặt

<?php 

$usersTimezone = 'America/New_York'; 
$date = new DateTime('Thu, 31 Mar 2011 02:05:59 GMT', new DateTimeZone($usersTimezone)); 
echo $date->format('Y-m-d H:i:s'); 

Đây là một phiên bản tiết hơn để hiển thị quá trình này một chút rõ ràng hơn

<?php 

// Date for a specific date/time: 
$date = new DateTime('Thu, 31 Mar 2011 02:05:59 GMT'); 

// Output date (as-is) 
echo $date->format('l, F j Y g:i:s A');  

// Output line break (for testing) 
echo "\n<br />\n"; 

// Example user timezone (to show it can be used dynamically) 
$usersTimezone = 'America/New_York'; 

// Convert timezone 
$tz = new DateTimeZone($usersTimezone); 
$date->setTimeZone($tz); 

// Output date after 
echo $date->format('l, F j Y g:i:s A'); 

Libraries

  • Carbon - Một thư viện ngày rất phổ biến.
  • Chronos - Một thay thế thả cho Carbon tập trung vào bất biến. Xem dưới đây về lý do tại sao điều đó quan trọng.
  • jenssegers/date - Phần mở rộng của Carbon bổ sung hỗ trợ đa ngôn ngữ.

Tôi chắc chắn có một số thư viện khác có sẵn, nhưng đây là một số thư viện tôi quen thuộc.


Bonus Bài học: Bất biến ngày Objects

Trong khi bạn đang ở đây, hãy để tôi giúp bạn tiết kiệm một số đau đầu trong tương lai. Giả sử bạn muốn tính 1 tuần kể từ hôm nay và 2 tuần kể từ hôm nay. Bạn có thể viết một số mã như:

<?php 

// Create a datetime (now, in this case 2017-Feb-11) 
$today = new DateTime(); 

echo $today->format('Y-m-d') . "\n<br>"; 
echo "---\n<br>"; 

$oneWeekFromToday = $today->add(new DateInterval('P7D')); 
$twoWeeksFromToday = $today->add(new DateInterval('P14D')); 

echo $today->format('Y-m-d') . "\n<br>"; 
echo $oneWeekFromToday->format('Y-m-d') . "\n<br>"; 
echo $twoWeeksFromToday->format('Y-m-d') . "\n<br>"; 
echo "\n<br>"; 

Sản lượng:

2017-02-11 
--- 
2017-03-04 
2017-03-04 
2017-03-04 

Hmmmm ... Đó không phải là khá gì chúng tôi muốn. Việc sửa đổi đối tượng DateTime truyền thống trong PHP không chỉ trả về ngày được cập nhật mà còn sửa đổi đối tượng ban đầu.

Đây là nơi DateTimeImmutable do thỏa thuận hợp

$today = new DateTimeImmutable(); 

echo $today->format('Y-m-d') . "\n<br>"; 
echo "---\n<br>"; 

$oneWeekFromToday = $today->add(new DateInterval('P7D')); 
$twoWeeksFromToday = $today->add(new DateInterval('P14D')); 

echo $today->format('Y-m-d') . "\n<br>"; 
echo $oneWeekFromToday->format('Y-m-d') . "\n<br>"; 
echo $twoWeeksFromToday->format('Y-m-d') . "\n<br>"; 

Kết quả:.

2017-02-11 
--- 
2017-02-11 
2017-02-18 
2017-02-25 

Trong ví dụ thứ hai này, chúng tôi nhận được ngày chúng tôi mong đợi trở lại. Bằng cách sử dụng DateTimeImmutable thay vì DateTime, chúng tôi ngăn chặn đột biến trạng thái ngẫu nhiên và ngăn chặn các lỗi tiềm ẩn.

+0

Đánh giá cao câu trả lời @DesignerGuy, nhưng đây là danh sách các múi giờ được hỗ trợ * thích hợp *: http://php.net/manual/en/timezones.php –

+1

Cảm ơn @ChrisHarrison. Chỉ cần cập nhật câu trả lời. – DesignerGuy

+1

Đây phải là câu trả lời được chấp nhận và chỉ là những gì tôi đang tìm kiếm. Cảm ơn! – Brett

1

Tôi đã tạo ra một số chức năng đơn giản, bạn có thể sử dụng để chuyển đổi thời gian cho bất kỳ múi giờ:

function convertTimeToLocal($datetime,$timezone='Europe/Dublin') { 
     $given = new DateTime($datetime, new DateTimeZone("UTC")); 
     $given->setTimezone(new DateTimeZone($timezone)); 
     $output = $given->format("Y-m-d"); //can change as per your requirement 
     return $output; 
} 
Các vấn đề liên quan