nhận thời gian UTC bằng PHP


122

Làm cách nào để nhận dấu thời gian UTC / GMT +/- bằng cách sử dụng hàm date () của PHP? Ví dụ, nếu tôi cố gắng

date("Y-m-d H:i:s", time()); 

Tôi sẽ nhận được tem thời gian Unix; nhưng tôi cần lấy dấu thời gian UTC / GMT với chuỗi GMT / UTC +/- 0400 hoặc GMT / UTC +/- 1000 dựa trên thời gian địa phương.


1
@JeffPuckettII GMT không thay đổi để tiết kiệm ánh sáng ban ngày. Vương quốc Anh thay đổi từ GMT thành BST vào mùa hè, nhưng GMT vẫn giữ nguyên và luôn khớp với UTC.
lewis

Câu trả lời:


111

Việc sử dụng gmdatesẽ luôn trả về ngày GMT. Cú pháp tương tự như for date.


12
@sanmai: dấu thời gian Unix theo định nghĩa luôn là UTC. en.wikipedia.org/wiki/Unix_time
nikc.org

1
@ nikc.org: Vấn đề là gmdate ("U"), trả về giống như time (), không phải là dấu thời gian UTC nếu múi giờ hệ thống máy chủ của bạn khác. Cách duy nhất tôi có thể lấy dấu thời gian dựa trên UTC thực là strtotime (gmdate ("M d YH: i: s")), khác với gmdate ("U"), khi múi giờ hệ thống máy chủ của bạn khác với UTC
bksi

@bksi Tôi không thể lặp lại hành vi đã mô tả của bạn. (Máy của tôi không ở chế độ GMT và dấu thời gian UNIX của tôi chính xác. Ngoài ra gmdate("U") == time().) Có vẻ như hành vi có thể có lỗi. Kiểm tra kỹ và gửi lỗi cho dự án PHP.
nikc.org

Tôi đã sử dụng tập lệnh php đơn giản để kiểm tra kịch bản: <? echo time (). "===" .strtotime (gmdate ("M d YH: i: s")). "Múi giờ:" .date ("Z"). "\ n"; ?> Khi tôi chạy nó, tôi nhận được kết quả này: 1456342082 === 1456338482 Múi giờ: 3600 Kết quả của ngày lệnh shell là: Thứ tư 24 tháng 2 20:28:11 CET 2016
bksi

1
@bksi - Có lẽ bạn đang nhầm lẫn giữa đại diện nội bộ của datetime với đại diện bên ngoài của datetime? thời gian w / bộ xác định vùng oa so với thời gian với bộ chỉ định vùng? Như nikc (và tài liệu) cho biết, time()trả về "số giây kể từ Kỷ nguyên Unix (ngày 1 tháng 1 năm 1970 00:00:00 GMT)". Ghi chú GMT. Thực tế là theo mặc định, hệ thống của bạn chuyển đổi múi giờ này thành múi giờ của bạn để hiển thị, là một sự thuận tiện cho người dùng. Trong nội bộ, nó luôn là GMT.
ToolmakerSteve


47

Như đã trả lời trước đây ở đây , vì PHP 5.2.0, bạn có thể sử dụng DateTimelớp và chỉ định múi giờ UTC với phiên bản củaDateTimeZone .

Tài liệu DateTime __construct () đề xuất chuyển "now" làm tham số đầu tiên khi tạo một phiên bản DateTime và chỉ định múi giờ để lấy thời gian hiện tại.

$date_utc = new \DateTime("now", new \DateTimeZone("UTC"));

echo $date_utc->format(\DateTime::RFC850); # Saturday, 18-Apr-15 03:23:46 UTC

3
Tài liệu DateTime __construct () không còn đề xuất bỏ qua tham số đầu tiên để lấy thời gian hiện tại. Bây giờ nó nói rằng bạn nên sử dụng một chuỗi 'bây giờ'.
PaulSkinner

Cảm ơn @PaulSkinner, tôi đã sửa đổi câu trả lời.
Jessedc

Cảm ơn, mục đích của dấu gạch chéo ngược trước đây là DateTimegì? Tự mình chạy nó, nó có vẻ hoạt động tốt mà không có chúng.
Tuyết

1
@Snow Nếu mã này được chèn vào mã không gian tên, giả sử tệp của bạn có namespace Akhai báo ở trên cùng, PHP sẽ giả sử DateTimelà tham chiếu đến A\DateTime, điều này là sai. Thêm dấu gạch chéo ngược sẽ khắc phục được sự cố. Theo tôi, đó là một thói quen tốt ngay cả khi bạn chưa sử dụng không gian tên.
Niavlys

35
$time = time();
$check = $time+date("Z",$time);
echo strftime("%B %d, %Y @ %H:%M:%S UTC", $check);

3
@AlainTiemblo không chính xác; bạn cần phải trừ bù đắp để làm cho nó làm việc
sanmai


14

Lấy ngày UTC

gmdate("Y-m-d H:i:s");

Lấy dấu thời gian UTC

time();

Kết quả sẽ không khác ngay cả khi bạn có date_default_timezone_setmã của mình.


@ زياد Cảm ơn bạn đã sửa chữa, tôi đã sửa đổi câu trả lời của tôi
StefansArya

Tôi nghĩ rằng gmdate () trả về GMT chứ không phải UTC. "Giống với hàm date () ngoại trừ thời gian trả về là Giờ chuẩn Greenwich (GMT)". Tui bỏ lỡ điều gì vậy? Chúng có tương đương nhau không?
Jordan

3
@Jordan Trong thực tế, UTC và GMT biểu thị cùng một thời điểm. stackoverflow.com/questions/48942916/…
martti

12

Ngoài việc gọi điện, gmdatebạn cũng có thể đặt mã này trước phần còn lại của mã:

<?php
date_default_timezone_set("UTC");
?>

Điều đó sẽ thực hiện phần còn lại của các cuộc gọi liên quan đến ngày / giờ của bạn để sử dụng múi giờ GMT / UTC.


Không còn trong các phiên bản PHP mới nhất.
Khom Nazid

1
@KhomNazid "UTC" làm tham số vẫn hợp lệ. php.net/manual/en/…
Harikrishna

6

Bạn có thể sử dụng hàm gmmktime mà không cần đối số để lấy dấu thời gian UTC hiện tại:

$time = gmmktime();
echo date("Y-m-d H:i:s", $time); 

gmmktime sẽ chỉ hoạt động nếu thời gian máy chủ của bạn đang sử dụng UTC. Ví dụ: máy chủ của tôi được đặt thành Hoa Kỳ / Thái Bình Dương. chức năng được liệt kê ở trên lặp lại giờ Thái Bình Dương.


gmmktime () không được dùng nữa
Jonny

2

với chuỗi GMT / UTC +/- 0400 hoặc GMT / UTC +/- 1000 dựa trên thời gian địa phương

Định dạng tùy chỉnh của bạn chỉ thiếu Ođể cung cấp cho bạn chênh lệch múi giờ so với giờ địa phương.

Chênh lệch với giờ Greenwich (GMT) theo giờ Ví dụ: +0200

date_default_timezone_set('America/La_Paz');
echo date('Y-m-d H:i:s O');

2018-01-12 12:10:11 -0400

Tuy nhiên, để tối đa hóa tính di động / khả năng tương tác, tôi khuyên bạn nên sử dụng định dạng ngày ISO8601c

date_default_timezone_set('America/La_Paz');
echo date('c');

2018-01-12T12: 10: 11-04: 00

date_default_timezone_set('Australia/Brisbane');
echo date('c');

2018-01-13T02: 10: 11 + 10: 00

Bạn cũng có thể sử dụng gmdatevà chuỗi bù đắp múi giờ sẽ luôn là+00:00

date_default_timezone_set('America/La_Paz');
echo gmdate('c');

2018-01-12T16: 10: 11 + 00: 00

date_default_timezone_set('Australia/Brisbane');
echo gmdate('c');

2018-01-12T16: 10: 11 + 00: 00


1

Bạn có thể sử dụng sau đây để nhận thời gian UTC:

date_default_timezone_set('Asia/Calcutta');

$current_date = date("Y/m/d g:i A");

$ist_date = DateTime::createFromFormat(
                        '"Y/m/d g:i A"',
                        $current_date,
                        new DateTimeZone('Asia/Calcutta')
                    );

$utc_date = clone $ist_date;
$utc_date->setTimeZone(new DateTimeZone('UTC'));

echo 'UTC:  ' . $utc_date->format('Y-m-d g:i A');

0
/**
     * Converts a local Unix timestamp to GMT
     *
     * @param   int Unix timestamp
     * @return  int
     */
    function local_to_gmt($time = '')
    {
        if ($time === '')
        {
            $time = time();
        }

        return mktime(
            gmdate('G', $time),
            gmdate('i', $time),
            gmdate('s', $time),
            gmdate('n', $time),
            gmdate('j', $time),
            gmdate('Y', $time)
        );
    }

0

Dưới đây tìm mã PHP để nhận thời gian UTC (Giờ phối hợp quốc tế) hiện tại

<?php
// Prints the day
echo gmdate("l") . "<br>";

// Prints the day, date, month, year, time, AM or PM
echo gmdate("l jS \of F Y h:i:s A");
?>

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.