Nhận ngày hiện tại, được cung cấp múi giờ trong PHP?


76

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?


Bạn chắc chắn nên chấp nhận câu trả lời DesignerGuy của hoặc thay đổi tiêu đề của câu hỏi của bạn để một cái gì đó giống như "thiết lập múi giờ mặc định" ...
Axel

1
@Axel Xong, tôi không còn là một nhà phát triển PHP nữa, nhưng tôi hy vọng nó sẽ hữu ích.
einstein

Làm tốt! Đó là quyết định đúng đắn IMHO ...
Axel

Câu trả lời:


198

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');

Thư viện

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

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.


Bài học bổ sung: Đối tượng ngày bất biến

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 DateTimeImmutablethay 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.


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

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

Đôi khi nhận xét giúp ích :)
Axel

54

Đặ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


11
Lưu ý rằng việc sử dụng 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ờ.
Andy Fleming

9
Hiện tại, thực tế không tốt nếu bạn chỉ muốn có 1 ngày trong múi giờ đó, hãy xem câu trả lời của DesignerGuy bên dưới để có giải pháp phù hợp hơn.
DS Phường

Rất vui nếu có cách chọn múi giờ chung.
Zan

4

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.


4

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;
}

1
<?php
date_default_timezone_set('GMT-5');//Set New York timezone
$today = date("F j, Y")
?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.