Tôi muốn lấy ngày trong ngày cho múi giờ ở định dạng Paul Eggert ( America/New_York
) trong PHP?
Tôi muốn lấy ngày trong ngày cho múi giờ ở định dạng Paul Eggert ( America/New_York
) trong PHP?
Câu trả lời:
Các câu trả lời khác đặt múi giờ cho tất cả các ngày trong hệ thống của bạn. Đ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');
Hoạt động trong PHP> = 5.2.0
Danh sách các múi giờ được hỗ trợ: php.net/manual/en/timezones.php
Đây là phiên bản có thời gian hiện có và múi giờ do người dùng cài đặ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 dài hơn để hiển thị quá trình rõ ràng hơn một chút
<?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');
Tôi chắc rằng có một số thư viện khác có sẵn, nhưng đây là một số thư viện mà tôi quen thuộc.
Khi bạn ở đây, hãy để tôi giúp bạn đỡ đ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(DateInterval::createFromDateString('7 days'));
$twoWeeksFromToday = $today->add(DateInterval::createFromDateString('14 days'));
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>";
Đầu ra:
2017-02-11
---
2017-03-04
2017-03-04
2017-03-04
Hmmmm ... Đó không phải là những gì chúng tôi muốn. Sửa đổi một truyền thốngDateTime
đối tượng trong PHP không chỉ trả về ngày cập nhật mà còn sửa đổi cả đối tượng gốc.
Đây là nơi DateTimeImmutable
đi vào.
$today = new DateTimeImmutable();
echo $today->format('Y-m-d') . "\n<br>";
echo "---\n<br>";
$oneWeekFromToday = $today->add(DateInterval::createFromDateString('7 days'));
$twoWeeksFromToday = $today->add(DateInterval::createFromDateString('14 days'));
echo $today->format('Y-m-d') . "\n<br>";
echo $oneWeekFromToday->format('Y-m-d') . "\n<br>";
echo $twoWeeksFromToday->format('Y-m-d') . "\n<br>";
Đầu ra:
2017-02-11
---
2017-02-11
2017-02-18
2017-02-25
Trong ví dụ thứ hai này, chúng tôi lấy lại những ngày mà chúng tôi mong đợi. Bằng cách sử dụng DateTimeImmutable
thay thế DateTime
, chúng tôi ngăn chặn các đột biến trạng thái ngẫu nhiên và ngăn chặn các lỗi tiềm ẩn.
Đặt múi giờ mặc định trước và lấy ngày sau đó, ngày sẽ ở 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/ Chức năng.date-default-timezone-set.php
date_default_timezone_set()
đặt nó cho tất cả việc sử dụng date()
sau thời điểm đó. Xem câu trả lời của tôi để biết ví dụ về cách quản lý nhiều múi giờ.
Nếu bạn có quyền truy cập vào PHP 5.3, phần mở rộng intl rất hữu ích để làm những việc như thế này.
Đây là một ví dụ từ sách 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().
Vì bạn có thể đặt Múi giờ chẳng hạn America/New_York
, điều này tốt hơn nhiều so với việc sử dụng độ lệch GMT hoặc UTC, vì điều này cũng tính đến khoảng thời gian tiết kiệm ánh sáng trong ngày.
Cuối cùng, vì phần mở rộng intl sử dụng dữ liệu ICU, chứa rất 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.
Tôi đã tạo một số hàm đơn giản mà bạn có thể sử dụng để chuyển đổi thời gian sang bất kỳ múi giờ nào:
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;
}