รับเวลา UTC ใน PHP


122

ฉันจะรับการประทับเวลา UTC / GMT +/- โดยใช้ฟังก์ชัน date () ของ PHP ได้อย่างไร ตัวอย่างเช่นถ้าฉันพยายาม

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

ฉันจะได้รับการประทับเวลา Unix แต่ฉันต้องได้รับการประทับเวลา UTC / GMT ด้วยสตริง GMT / UTC +/- 0400 หรือ GMT / UTC +/- 1000 ตามการกำหนดเวลาท้องถิ่น


1
@JeffPuckettII GMT ไม่เปลี่ยนแปลงสำหรับการออมแสง สหราชอาณาจักรเปลี่ยนจาก GMT เป็น BST ในฤดูร้อน แต่ GMT ยังคงเหมือนเดิมและตรงกับ UTC เสมอ
lewis

คำตอบ:


111

การใช้gmdateจะส่งกลับวันที่ GMT เสมอ dateไวยากรณ์เช่นเดียวกับ


12
@sanmai: การประทับเวลา Unix เป็นไปตามความหมายเสมอ UTC en.wikipedia.org/wiki/Unix_time
nikc.org

1
@ nikc.org: ปัญหาคือ gmdate ("U") จะคืนค่าเหมือนกับ time () ซึ่งไม่ใช่การประทับเวลา UTC หากเขตเวลาของระบบเซิร์ฟเวอร์ของคุณแตกต่างกัน วิธีเดียวที่ฉันจะได้รับการประทับเวลาตาม UTC จริงคือ strtotime (gmdate ("M d YH: i: s")) ซึ่งแตกต่างจาก gmdate ("U") เมื่อเขตเวลาของระบบเซิร์ฟเวอร์ของคุณแตกต่างจาก UTC
bksi

@bksi ฉันไม่สามารถทำซ้ำพฤติกรรมที่คุณอธิบายได้ (เครื่องของฉันไม่ได้อยู่ใน GMT และการประทับเวลา UNIX ของฉันก็ถูกต้องเช่นgmdate("U") == time()กัน) ดูเหมือนอาจเป็นพฤติกรรมของรถ ตรวจสอบอีกครั้งและส่งข้อบกพร่องกับโครงการ PHP
nikc.org

ฉันใช้สคริปต์ php อย่างง่ายเพื่อทดสอบสถานการณ์: เวลาสะท้อน (). "===" .strtotime (gmdate ("M d YH: i: s")). "Timezone:" .date ("Z"). "\ n"; ?> เมื่อฉันรันฉันได้ผลลัพธ์นี้: 1456342082 === 1456338482 เขตเวลา: 3600 ผลลัพธ์ของวันที่คำสั่งเชลล์คือ: พ. 24 ก.พ. 20:28:11 CET 2016
bksi

1
@bksi - บางทีคุณอาจสับสนในการแสดงวันที่และเวลาภายในด้วยการแสดงวันที่และเวลาภายนอก เวลาที่ไม่มีตัวระบุโซนเทียบกับเวลาที่มีตัวระบุโซน? ดังที่ nikc (และเอกสารประกอบ) กล่าวว่าtime()จะส่งคืน "จำนวนวินาทีนับตั้งแต่ยุค Unix (1 มกราคม 1970 00:00:00 GMT)" หมายเหตุGMT. ความจริงที่ว่าโดยค่าเริ่มต้นระบบของคุณจะแปลงสิ่งนี้เป็นเขตเวลาของคุณเพื่อแสดงเป็นความสะดวกของผู้ใช้ ภายใน GMT เสมอ
ToolmakerSteve


47

ตามที่เคยตอบไว้ที่นี่ตั้งแต่ PHP 5.2.0 คุณสามารถใช้DateTimeคลาสและระบุเขตเวลา UTC ด้วยอินสแตนซ์ของDateTimeZone.

เอกสาร DateTime __construct ()แนะนำให้ส่ง "now" เป็นพารามิเตอร์แรกเมื่อสร้างอินสแตนซ์ DateTime และระบุเขตเวลาเพื่อรับเวลาปัจจุบัน

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

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

3
เอกสาร DateTime __construct () ไม่แนะนำให้ละเว้นพารามิเตอร์แรกเพื่อรับเวลาปัจจุบันอีกต่อไป ตอนนี้บอกว่าคุณควรใช้สตริง "now"
PaulSkinner

ขอบคุณ @PaulSkinner ฉันได้แก้ไขคำตอบแล้ว
Jessedc

ขอบคุณจุดประสงค์ของแบ็กสแลชก่อนหน้านี้DateTimeคืออะไร? ใช้งานเองดูเหมือนว่าจะทำงานได้ดีหากไม่มีพวกเขา
หิมะ

1
@Snow หากใส่โค้ดนี้ลงในโค้ดเนมสเปซสมมติว่าไฟล์ของคุณมีการnamespace Aประกาศที่ด้านบน PHP จะถือว่าDateTimeอ้างถึงA\DateTimeซึ่งผิด การเพิ่มแบ็กสแลชช่วยแก้ปัญหาได้ เป็นนิสัยที่ดีแม้ว่าคุณจะไม่ได้ใช้เนมสเปซก็ตามในความคิดของฉัน
Niavlys

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

3
@AlainTiemblo ไม่ค่อย; คุณต้องลบค่าชดเชยเพื่อให้มันทำงานได้
sanmai


14

รับวันที่ UTC

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

การขอรับการประทับเวลา UTC

time();

ผลลัพธ์จะไม่แตกต่างกันแม้ว่าคุณจะมีdate_default_timezone_setรหัสของคุณก็ตาม


@ زيادขอบคุณสำหรับการแก้ไขฉันได้แก้ไขคำตอบของฉันแล้ว
StefansArya

ฉันคิดว่า gmdate () คืนค่า GMT ไม่ใช่ UTC "เหมือนกับฟังก์ชัน date () ยกเว้นว่าเวลาที่ส่งกลับคือเวลามาตรฐานกรีนิช (GMT)" ฉันพลาดอะไรไปรึเปล่า? สิ่งเหล่านี้ออกมาเทียบเท่าหรือไม่?
จอร์แดน

3
@ จอร์แดนในทางปฏิบัติ UTC และ GMT เป็นตัวแทนของเวลาเดียวกัน stackoverflow.com/questions/48942916/…
martti

12

นอกเหนือจากการโทรgmdateคุณยังสามารถใส่รหัสนี้ก่อนรหัสที่เหลือของคุณ:

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

ซึ่งจะทำให้การโทรที่เกี่ยวข้องกับวันที่ / เวลาของคุณเหลือเพื่อใช้เขตเวลา GMT / UTC


ไม่มีอีกแล้วใน PHP เวอร์ชันล่าสุด
Khom Nazid

1
@KhomNazid "UTC" เป็นพารามิเตอร์ยังคงถูกต้อง php.net/manual/th/…
Harikrishna

6

คุณสามารถใช้ฟังก์ชันgmmktimeโดยไม่มีข้อโต้แย้งเพื่อรับการประทับเวลา UTC ปัจจุบัน:

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

gmmktime จะใช้ได้ก็ต่อเมื่อเวลาเซิร์ฟเวอร์ของคุณใช้ UTC ตัวอย่างเช่นเซิร์ฟเวอร์ของฉันตั้งค่าเป็น US / Pacific ฟังก์ชันที่ระบุไว้ด้านบนสะท้อนกลับเวลาแปซิฟิก


gmmktime () เลิกใช้งานแล้ว
จอนนี่

2

ด้วยสตริง GMT / UTC +/- 0400หรือ GMT / UTC +/- 1,000ตามการกำหนดเวลาท้องถิ่น

รูปแบบที่กำหนดเองของคุณหายไปเพียงOเพื่อให้คุณมีการชดเชยเขตเวลาจากเวลาท้องถิ่น

ผลต่างกับเวลากรีนิช (GMT) เป็นชั่วโมงตัวอย่าง: +0200

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

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

อย่างไรก็ตามเพื่อความสามารถในการพกพา / การทำงานร่วมกันได้สูงสุดฉันขอแนะนำให้ใช้รูปแบบวันที่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

คุณสามารถใช้gmdateและสตริงออฟเซ็ตเขตเวลาจะเป็นเสมอ+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

คุณสามารถใช้สิ่งต่อไปนี้เพื่อรับเวลา 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

ด้านล่างค้นหาโค้ด PHP เพื่อรับเวลา UTC ปัจจุบัน (เวลาสากลเชิงพิกัด)

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.