จากคู่มือ ( ส่วน 9.6 ):
ค่าปัจจุบันของโซนเวลาทั่วโลกและเฉพาะลูกค้าสามารถเรียกคืนได้ดังนี้:
mysql> SELECT @@global.time_zone, @@session.time_zone;
แก้ไขผลตอบแทนข้างต้นSYSTEM
หาก MySQL ถูกตั้งค่าเป็นทาสให้กับเขตเวลาของระบบซึ่งมีประโยชน์น้อยกว่า เนื่องจากคุณกำลังใช้ PHP ถ้าคำตอบจาก MySQL เป็นSYSTEM
แล้วคุณสามารถขอให้ระบบสิ่งที่เขตก็date_default_timezone_get
ใช้ผ่านทาง (แน่นอนตามที่ VolkerK ชี้ให้เห็น PHP อาจทำงานบนเซิร์ฟเวอร์ที่แตกต่างกัน แต่เป็นไปตามข้อสมมติสมมติว่าเว็บเซิร์ฟเวอร์และเซิร์ฟเวอร์ DB นั้นกำลังพูดถึงตั้งเป็น [หากไม่ได้อยู่ใน ] เขตเวลาเดียวกันไม่ใช่ก้าวกระโดดครั้งใหญ่ ) แต่ระวังว่า (เช่นเดียวกับ MySQL) คุณสามารถตั้งค่าเขตเวลาที่ PHP ใช้ (date_default_timezone_set
) ซึ่งหมายความว่าอาจรายงานค่าที่แตกต่างจากระบบปฏิบัติการที่ใช้อยู่ หากคุณเป็นผู้ควบคุมโค้ด PHP คุณควรรู้ว่าคุณทำเช่นนั้นและไม่เป็นไร
แต่คำถามทั้งหมดของสิ่งที่เขตเวลา MySQL เซิร์ฟเวอร์ที่ใช้อาจจะสัมผัสกันเพราะถามเซิร์ฟเวอร์สิ่งเขตเวลามันอยู่ในบอกคุณไม่มีอะไรแน่นอนเกี่ยวกับข้อมูลในฐานข้อมูล อ่านต่อเพื่อดูรายละเอียด:
การอภิปรายเพิ่มเติม :
หากคุณเป็นผู้ควบคุมเซิร์ฟเวอร์แน่นอนคุณสามารถมั่นใจได้ว่าเขตเวลานั้นเป็นปริมาณที่ทราบ หากคุณไม่ได้อยู่ในการควบคุมของเซิร์ฟเวอร์คุณสามารถตั้งค่าเขตเวลาที่ใช้โดยการเชื่อมต่อของคุณดังนี้:
set time_zone = '+00:00';
ที่กำหนดเขตเวลาเป็น GMT เพื่อให้การดำเนินการเพิ่มเติมใด ๆ (เช่นnow()
) จะใช้ GMT
โปรดทราบว่าค่าเวลาและวันที่จะไม่ถูกเก็บไว้กับข้อมูลเขตเวลาใน MySQL:
mysql> create table foo (tstamp datetime) Engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)
mysql> insert into foo (tstamp) values (now());
Query OK, 1 row affected (0.00 sec)
mysql> set time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select tstamp from foo;
+---------------------+
| tstamp |
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select tstamp from foo;
+---------------------+
| tstamp |
+---------------------+
| 2010-05-29 08:31:59 | <== Note, no change!
+---------------------+
1 row in set (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-05-29 08:32:38 | <== Note, it changed!
+---------------------+
1 row in set (0.00 sec)
ดังนั้นการรู้เขตเวลาของเซิร์ฟเวอร์ที่มีความสำคัญเฉพาะในแง่ของการทำงานที่ได้รับเวลาในขณะนี้เช่นnow()
, unix_timestamp()
ฯลฯ .; ไม่ได้บอกอะไรคุณเกี่ยวกับวันที่ในเขตข้อมูลที่ใช้ คุณอาจเลือกที่จะสมมติว่าพวกเขาเขียนโดยใช้เขตเวลาของเซิร์ฟเวอร์ แต่ข้อสันนิษฐานนั้นอาจมีข้อบกพร่อง หากต้องการทราบเขตเวลาของวันที่หรือเวลาใด ๆ ที่จัดเก็บไว้ในข้อมูลคุณต้องตรวจสอบให้แน่ใจว่าพวกเขาถูกเก็บไว้ในข้อมูลเขตเวลาหรือ (อย่างที่ฉันทำ) เพื่อให้แน่ใจว่าพวกเขาอยู่ใน GMT
ทำไมการสมมติว่าข้อมูลถูกเขียนโดยใช้เขตเวลาของเซิร์ฟเวอร์มีข้อบกพร่อง ข้อมูลอาจถูกเขียนโดยใช้การเชื่อมต่อที่ตั้งค่าเขตเวลาที่แตกต่างกัน ฐานข้อมูลอาจถูกย้ายจากเซิร์ฟเวอร์หนึ่งไปยังเซิร์ฟเวอร์อื่นซึ่งเซิร์ฟเวอร์อยู่ในเขตเวลาที่แตกต่างกัน (ฉันพบว่าเมื่อฉันรับฐานข้อมูลที่ย้ายจากเท็กซัสไปแคลิฟอร์เนีย) แต่แม้ว่าข้อมูลที่ถูกเขียนไว้ในเซิร์ฟเวอร์ที่มีโซนเวลาปัจจุบันก็ยังคงคลุมเครือ เมื่อปีที่แล้วในสหรัฐอเมริกาเวลาออมแสงถูกปิดในเวลา 2:00 น. ของวันที่ 1 พฤศจิกายน สมมติว่าเซิร์ฟเวอร์ของฉันอยู่ในแคลิฟอร์เนียโดยใช้เขตเวลาแปซิฟิกและฉันมีค่า2009-11-01 01:30:00
ในฐานข้อมูล มันเกิดขึ้นเมื่อไร? นั่นคือ 1:30 น. วันที่ 1 พฤศจิกายน PDT หรือ 1:30 น. วันที่ 1 พฤศจิกายนเวลา PST (หนึ่งชั่วโมงต่อมา)? คุณไม่มีทางรู้อย่างแน่นอน คุณธรรม: ควรเก็บวันที่ / เวลาใน GMT (ซึ่งไม่ได้ทำ DST) และแปลงเป็นเขตเวลาที่ต้องการเมื่อ / จำเป็น