กำหนดเขตเวลาของผู้ใช้


610

มีวิธีมาตรฐานสำหรับเว็บเซิร์ฟเวอร์เพื่อให้สามารถกำหนดเขตเวลาของผู้ใช้ในหน้าเว็บได้หรือไม่?

อาจมาจากส่วนหัว HTTP หรือส่วนหนึ่งของuser-agentสตริง?


6
ถามผู้ใช้ หากคุณได้รับเขตเวลาจากคอมพิวเตอร์ของผู้ใช้และมีการตั้งค่าผิดแล้วอะไร
Rob Williams

40
ถ้าอย่างนั้นผู้ใช้อาจไม่สนใจ?
agnoster

2
คุณหมายถึงstackoverflow.com/q/1091372/218196หรือไม่
เฟลิกซ์คลิง

2
น่าเสียดายที่คำตอบสำหรับคำถามนี้ยังอนุญาตสำหรับการทำโปรไฟล์ผู้ใช้และการกำหนดตำแหน่งทางภูมิศาสตร์
William Entriken

1
ทำไมคุณต้องรู้เขตเวลาของผู้ใช้?
Braiam

คำตอบ:


326
-new Date().getTimezoneOffset()/60;

วิธีgetTimezoneOffset()นี้จะลบเวลาของคุณออกจาก GMT และส่งกลับจำนวนนาที ดังนั้นหากคุณอาศัยอยู่ใน GMT-8 มันจะกลับ 480

หากต้องการนำสิ่งนี้เข้าสู่ชั่วโมงให้หารด้วย 60 และสังเกตว่าเครื่องหมายตรงข้ามกับสิ่งที่คุณต้องการ - มันเป็นการคำนวณออฟเซ็ตของ GMT จากเขตเวลาของคุณไม่ใช่ออฟเซ็ตเขตเวลาของคุณจาก GMT ในการแก้ไขปัญหานี้เพียงแค่คูณด้วย -1

โปรดทราบด้วยว่าw3schoolพูดว่า:

ค่าที่ส่งคืนไม่ใช่ค่าคงที่เนื่องจากการฝึกใช้ Daylight Saving Time


5
แล้วผู้ใช้ที่ใช้โทรศัพท์มือถือที่มีเบราว์เซอร์ที่ไม่รองรับจาวาสคริปต์ล่ะ? ฉันชอบคำถามผู้ใช้ถามเกี่ยวกับส่วนหัว HTTP ตัวแทนผู้ใช้ ... มีวิธีทำให้ฝั่งเซิร์ฟเวอร์งานนี้แม่นยำที่สุดเท่าที่จะเป็นไปได้หรือไม่
Nischal

18
วิธีนี้ใช้ไม่ได้กับ DST เสมอไป รับเขตเวลาชดเชยสิ่งที่มันบอกว่า มันจะได้รับการชดเชย โซนเวลาเป็นพื้นที่ทางภูมิศาสตร์จริง ๆ วิธีนี้ใช้ไม่ได้กับการประหยัดเวลากลางวันเนื่องจากคุณไม่รู้ว่าซีกโลกที่ผู้ใช้อาศัยอยู่หรือหากประเทศของพวกเขามีการประหยัดเวลากลางวันด้วย ทำไมไม่ใช้สิ่งนี้แทน:>>> date.toTimeString() "15:46:04 GMT+1200 (New Zealand Standard Time)"
Keyo

20
ฉันขอแตกต่างกับ Keyo นิยามของ getTimezoneOffset () (ตามมาตรฐาน ECMA ecma-international.org/ecma-262/5.1/#sec-15.9.5.26 ) คือ "ส่งคืนความแตกต่างระหว่างเวลาท้องถิ่นและเวลา UTC ในหน่วยนาที" - กล่าวอีกนัยหนึ่งก็ควรคำนึงถึงการประหยัดเวลากลางวันด้วย เอกสารของ Mozilla บอกว่า "การปรับเวลาตามฤดูกาลช่วยป้องกันไม่ให้ค่านี้เป็นค่าคงที่แม้กระทั่งสำหรับสถานที่ที่กำหนด"
xgretsch

11
@xgretsch: ได้รับออฟเซ็ตปัจจุบันของผู้ใช้จาก GMT ไม่เป็นไรถ้าคุณกำลังนำเสนอเวลาอื่นที่เกิดขึ้นในวันเดียวกัน (ยกเว้นวันที่ปัจจุบันคือวันที่เปลี่ยนซึ่งอาจเป็นความผิดพลาด) อย่างไรก็ตามมีหลายเขตเวลาที่มีออฟเซ็ตเดียวกันจาก GMT และพวกเขาอาจมีวันที่เปลี่ยนแปลงที่แตกต่างกันหรือไม่ใช้การปรับเวลาตามฤดูกาล
Mike Dimmick

12
สิ่งหนึ่งที่ควรทราบที่นี่; บางแห่ง (เช่น Newfoundland ในแคนาดา) มีเขตเวลาที่ปิดลงครึ่งชั่วโมงดังนั้นหลังจากหารด้วย 60 คำตอบของคุณอาจไม่ใช่จำนวนเต็ม
Jason Walton

193

วิธีที่นิยมที่สุด (== มาตรฐาน?) วิธีกำหนดเขตเวลาที่ฉันเคยเห็นคือการถามผู้ใช้ หากเว็บไซต์ของคุณต้องการการสมัครสมาชิกข้อมูลนี้อาจถูกบันทึกลงในข้อมูลโปรไฟล์ของผู้ใช้ สำหรับผู้ใช้ anon วันที่สามารถแสดงเป็น UTC หรือ GMT หรือบางอย่าง

ฉันไม่ได้พยายามจะเป็น aleck ที่ฉลาด เป็นเพียงบางครั้งปัญหาที่เกิดขึ้นมีวิธีแก้ปัญหาที่ดีกว่านอกบริบทการเขียนโปรแกรมใด ๆ


5
สิ่งที่เกี่ยวกับเมื่อผู้ใช้กำลังดาวน์โหลดไฟล์. ics ที่ควรมีเวลาเริ่มต้นเฉพาะที่ตั้งของพวกเขา (เช่น 9-11 น. ทั่วประเทศ)? พวกเขาไม่ควรพูดว่าเขตเวลาของพวกเขาคืออะไร
Marcy Sutton

33
@Ishmaeel: แต่ผู้ใช้เดินทางไปต่างประเทศและพวกเขาไม่จำเป็นต้องบอกเขตเวลาในแต่ละครั้งที่เข้าสู่ระบบจากเขตเวลาที่ไม่ใช่เจ้าของภาษา
Rajat Gupta

10
สิ่งนี้ไม่ตอบคำถามซึ่งบ่งบอกอย่างชัดเจนว่าเขากำลังมองหาวิธีแก้ปัญหาทางเทคโนโลยี
G-Wiz

5
@gWiz OP กำลังขอวิธีแก้ไขปัญหามาตรฐาน นี่เป็นมาตรฐานที่ค่อนข้างดี
Simon Bergot

4
ทางออกที่ดีที่สุดน่าจะเป็นการรวมกันของการถามผู้ใช้ (เช่นการจัดวางเขตเวลาที่ด้านบนของรายงาน) ในขณะที่การเริ่มต้นการเลือกแบบเลื่อนลงเป็นโซนเวลาที่กำหนดโดย GPS เมื่อผู้ใช้อยู่บนมือถือ อุปกรณ์ที่ให้ข้อมูลตำแหน่งและจะใช้ค่าเริ่มต้นเป็น UTC
Triynko

132

ไม่มีส่วนหัว HTTP ที่จะรายงานเขตเวลาของไคลเอ็นต์จนถึงแม้ว่าจะได้รับการแนะนำให้รวมไว้ในข้อกำหนด HTTP

ถ้าเป็นฉันฉันอาจจะพยายามดึงเขตเวลาโดยใช้ JavaScript ไคลเอนต์แล้วส่งไปยังเซิร์ฟเวอร์โดยใช้ Ajax หรือบางอย่าง


16
น่าแปลกที่นี่เป็นคำตอบเดียวที่ถูกต้องสำหรับคำถามซึ่งถามว่าจะทำอย่างไรกับฝั่งเซิร์ฟเวอร์ ฉันสงสัยว่าเหตุผลที่มีคำตอบอื่น ๆ ที่มีคะแนนโหวตมากขึ้นก็เพราะเมื่อคุณตระหนักว่าคุณต้องทำมันด้านลูกค้าคุณท้ายด้วยการใช้คำตอบอื่น ๆ แต่ใครก็ตามที่ผลักดันคำตอบของ IMHO ขึ้นมาก็ควรจะถอนคำตอบนี้เช่นกัน
TTT

ฉันเชื่อว่าวิธีที่ดีที่สุดคือการใช้ตำแหน่งทางภูมิศาสตร์ในการเรียงลำดับเขตเวลาที่เป็นไปได้และโดยค่าเริ่มต้นให้เลือกอันแรกที่ตรงกับ (ปิด) เพื่อชดเชยเวลาตัวแทนผู้ใช้ (จำเป็นต้องใช้ JavaScript) แม้หลังจากนั้นคุณต้องระบุวิธีแก้ไขเขตเวลาหลังจากแม้แต่วิธีนี้จะเลือกเขตเวลาที่ไม่ถูกต้อง
Mikko Rantalainen

@MikkoRantalainen ระวังเมื่อใช้พร็อกซี่ผ่านเพราะพวกเขาไม่ได้โฆษณาตัวเองในส่วนหัว
Matthieu

@ Matthieu มีคำตอบที่ดีกว่าในปัจจุบัน: stackoverflow.com/a/11836123/334451
Mikko Rantalainen

2
นี่เป็นคำตอบเดียวที่แท้จริงที่ตอบคำถามจริง ๆ
lscoughlin

54

JavaScript เป็นวิธีที่ง่ายที่สุดในการรับเวลาท้องถิ่นของลูกค้า ฉันขอแนะนำให้ใช้XMLHttpRequestเพื่อส่งกลับเวลาท้องถิ่นและหากล้มเหลวให้ย้อนกลับไปยังเขตเวลาที่ตรวจพบโดยยึดตามที่อยู่ IP ของพวกเขา

เท่าที่ตำแหน่งทางภูมิศาสตร์ฉันได้ใช้MaxMind GeoIPในหลายโครงการและทำงานได้ดี แต่ฉันไม่แน่ใจว่าพวกเขาให้ข้อมูลเขตเวลาหรือไม่ มันเป็นบริการที่คุณจ่ายและพวกเขาจะทำการอัพเดทฐานข้อมูลของคุณทุกเดือน พวกเขาให้บริการห่อในหลายภาษาเว็บ


ฉันโหวตให้คำตอบนี้แล้วเพราะละติจูดและลองจิจูดที่ได้รับจากฐานข้อมูลอย่าง GeoIP (ซึ่งมีรุ่นฟรีให้ใช้แล้ว) สามารถใช้ร่วมกับฐานข้อมูลที่แปลงพิกัดดังกล่าวเป็นเขตเวลาได้ ฉันคิดว่า GeoNames มีฐานข้อมูลแบบหลัง
Peter O.

เวอร์ชันปัจจุบัน (ทั้งฟรีและจ่ายเงิน) ของฐานข้อมูล MaxMind GeoIP / API ให้ข้อมูลเขตเวลา (ส่งกลับ "ยุโรป / ลอนดอน" สำหรับเขตเวลาของฉัน) ฉันจำไม่ได้ว่าระบบ GeoIP รุ่นเก่าของพวกเขาหรือไม่ ทำเช่นเดียวกัน แต่ตอนนี้ทำงานได้ดีมาก! ฟิลด์ MaxMind มีชื่อว่า "time_zone", "time_zone_name"
Matthew Slyman

51

ก่อนอื่นให้ทำความเข้าใจว่าการตรวจจับโซนเวลาใน JavaScript นั้นไม่สมบูรณ์ คุณจะได้รับในท้องถิ่นเขตเวลาชดเชยสำหรับวันและเวลาที่ใช้getTimezoneOffsetในตัวอย่างของการที่Dateวัตถุ แต่ที่ไม่มากเช่นเดียวกับที่เต็มไปด้วยโซนเวลา IANAAmerica/Los_Angelesเช่น

มีตัวเลือกบางอย่างที่สามารถทำงานได้:

  • เบราว์เซอร์ที่ทันสมัยส่วนใหญ่สนับสนุนเขตเวลาของ IANA ในการใช้งานECMAScript Internationalization APIดังนั้นคุณสามารถทำสิ่งนี้:

const tzid = Intl.DateTimeFormat().resolvedOptions().timeZone;
console.log(tzid);

ผลลัพธ์คือสตริงที่มีการตั้งค่าเขตเวลาของ IANA ของคอมพิวเตอร์ที่มีการเรียกใช้รหัส

สภาพแวดล้อมที่สนับสนุนมีการระบุไว้ในตารางการทำงานร่วมกันสนามบินนานาชาติ ขยายส่วนและมองไปที่คุณลักษณะที่มีชื่อDateTimeFormatresolvedOptions().timeZone defaults to the host environment

  • ห้องสมุดบางอย่างเช่นLuxonใช้ API luxon.Settings.defaultZoneNameนี้เพื่อกำหนดเขตเวลาที่ผ่านการทำงานเช่น

    • หากคุณต้องการสนับสนุนชุดของสภาพแวดล้อมที่กว้างขึ้นเช่นเว็บเบราว์เซอร์รุ่นเก่าคุณสามารถใช้ห้องสมุดเพื่อคาดเดาการเรียนรู้ที่โซนเวลา พวกเขาทำงานโดยพยายามIntlAPI ครั้งแรกหากมีอยู่และเมื่อไม่พร้อมใช้งานพวกเขาจะสอบถามgetTimezoneOffsetฟังก์ชันของDateวัตถุสำหรับจุดต่าง ๆ ในเวลาต่างๆโดยใช้ผลลัพธ์เพื่อเลือกเขตเวลาที่เหมาะสมจากชุดข้อมูลภายใน

    ทั้งjsTimezoneDetectและmoment-timezoneมีฟังก์ชันนี้

    // using jsTimeZoneDetect
    var tzid = jstz.determine().name();
    
    // using moment-timezone
    var tzid = moment.tz.guess();

    ในทั้งสองกรณีผลลัพธ์จะถือว่าเป็นการคาดเดาเท่านั้น การเดาอาจถูกต้องในหลายกรณี แต่ไม่ใช่ทั้งหมด

    นอกจากนี้ไลบรารีเหล่านี้ต้องได้รับการอัปเดตเป็นระยะเพื่อต่อต้านข้อเท็จจริงที่ว่าการใช้งาน JavaScript ที่เก่ากว่าจำนวนมากจะรับรู้เฉพาะกฎการปรับเวลาตามฤดูกาลปัจจุบันสำหรับโซนเวลาท้องถิ่น รายละเอียดเพิ่มเติมเกี่ยวกับที่นี่

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

นอกจากนี้ยังมีวิธีที่แตกต่างอย่างสิ้นเชิงโดยไม่ต้องพึ่งพาการตั้งค่าโซนเวลาของคอมพิวเตอร์ของผู้ใช้เลย แต่ถ้าคุณสามารถรวบรวมพิกัดละติจูดและลองจิจูดคุณสามารถแก้ไขเหล่านั้นไปยังโซนเวลาโดยใช้วิธีใดวิธีหนึ่งเหล่านี้ สิ่งนี้ทำงานได้ดีบนอุปกรณ์มือถือ


การใช้ตำแหน่งทางภูมิศาสตร์ของผู้ใช้ (เช่นตำแหน่งที่ตั้งของพวกเขา) เพื่ออนุมานเขตเวลานั้นมีข้อบกพร่องเช่นกัน ผู้ใช้อาจต้องการใช้เขตเวลาเฉพาะบนอุปกรณ์ที่ไม่ใช่เขตเวลาท้องถิ่นแม้ว่าจะคิดว่ามันอาจแสดงในเวลาเดียวกัน (หรือไม่ก็ตาม) เช่นนักเดินทางออกจากอุปกรณ์บ่อยครั้งโดยตั้งค่าเขตเวลาตามท้องถิ่นและอย่าคาดหวังว่าจะเห็นวันที่และเวลาใช้การชดเชยที่แตกต่างกันโดยไม่ได้รับคำแนะนำ ฉันอาจจะพูดคุยจากประสบการณ์ส่วนตัวที่นี่… ;-)
RobG

บอกไม่ได้ว่าคุณหลอกฉัน Rob ไหม ;) แต่ไม่มีวิธีการเหล่านี้ใช้ภาษาของพวกเขา แต่เป็นการตั้งค่าบนอุปกรณ์ดังนั้นสอดคล้องกับจุดของคุณ (เฉพาะวิธีสำรองที่กล่าวถึงในวรรคสุดท้ายจะใช้ตำแหน่งปัจจุบัน)
แมตต์จอห์นสัน - ไพน์

การตีพิมพ์โดยใช้คำศัพท์: "สถานที่เกิดเหตุ" นั้นไม่ใช่ที่ตั้งทางภูมิศาสตร์ของผู้ใช้ "สถานที่เกิดเหตุ" คือกลุ่มของการตั้งค่าเช่นภาษารูปแบบตัวเลขปฏิทิน ฯลฯ ตัวอย่างเช่นสถานที่ de_DE ระบุภาษาเยอรมันเป็นภาษาเริ่มต้นยูโรเป็นสกุลเงินเริ่มต้นจุลภาคเป็นตัวคั่นทศนิยมระยะเวลาเป็นตัวคั่นหลักพันและเกรโกเรียน เป็นปฏิทิน ดูdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/
......

49

นี่คือโซลูชัน JavaScript ที่มีประสิทธิภาพเพื่อกำหนดเขตเวลาที่เบราว์เซอร์อยู่

>>> var timezone = jstz.determine();
>>> timezone.name(); 
"Europe/London"

https://bitbucket.org/pellepim/jstimezonedetect

ภาคผนวก 1: ตอนนี้โครงการนี้ตั้งอยู่ที่ GitHub: https://github.com/pellepim/jstimezonedetect


14
คำตอบลิงก์ไม่ได้รับการสนับสนุนเพราะหากลิงก์หายไปคำตอบนั้นจะมีประโยชน์ และเนื่องจากไม่ได้ติดตามลิงก์ผู้อ่านจึงไม่ทราบว่าจะให้คำตอบที่ดีหรือไม่ ในกรณีนี้คุณสามารถชี้แจงได้ว่านี่เป็นห้องสมุดบุคคลที่สามซึ่งใช้วิธีการที่ใช้ฐานข้อมูลเพื่อระบุตัวตนและอาจอธิบายหลักการบางอย่างของการดำเนินงาน
IMSoP

1
นี้! นี่คือวิธีที่จะไป ไลบรารีแบบง่ายจัดการ DST อย่างถูกต้อง คำตอบอื่น ๆ เต็มไปด้วย WTF และหลายคนไม่ทำ DST
Dirbaio

1
ห้องสมุดนี้ฉลาดมาก ทำงานโดยการสอบถามออฟเซ็ตปัจจุบันเป็น UTC จากนั้นปรับเวลาวัตถุวันที่ของ JavaScript โดยการเพิ่มหรือย่อวินาทีจนกว่าจะเปลี่ยนเป็น UTC การใช้วิธีการนี้ไลบรารีนี้จะระบุการเปลี่ยนแปลง DST ให้เพียงพอเพื่อระบุเขตเวลาโดยเฉพาะ ฉันคิดว่าห้องสมุดน่าจะมีประสิทธิภาพที่ดียิ่งขึ้นถ้าทำการค้นหาแบบไบนารีแทนการค้นหาแบบเชิงเส้น ค่าส่งคืนคือคีย์ข้อมูลโซน IANA (หรือที่รู้จักในฐานข้อมูลเขตเวลา Olson)
Mikko Rantalainen

3
ห้องสมุดนี้ไม่จำเป็นอีกต่อไป เบราว์เซอร์สมัยใหม่รองรับ Intl API ซึ่งส่งคืนสตริงเขตเวลาของ IANA ดูคำตอบนี้
Dan Dascalescu

42

นี่คือวิธีที่สมบูรณ์มากขึ้น

  1. รับเขตเวลาชดเชยสำหรับผู้ใช้
  2. ทดสอบขอบเขตการปรับเวลากลางวันบางวันเพื่อดูว่าอยู่ในโซนที่ใช้การปรับเวลาตามฤดูกาลหรือไม่

ข้อความที่ตัดตอนมาอยู่ด้านล่าง:

function TimezoneDetect(){
    var dtDate = new Date('1/1/' + (new Date()).getUTCFullYear());
    var intOffset = 10000; //set initial offset high so it is adjusted on the first attempt
    var intMonth;
    var intHoursUtc;
    var intHours;
    var intDaysMultiplyBy;

    // Go through each month to find the lowest offset to account for DST
    for (intMonth=0;intMonth < 12;intMonth++){
        //go to the next month
        dtDate.setUTCMonth(dtDate.getUTCMonth() + 1);

        // To ignore daylight saving time look for the lowest offset.
        // Since, during DST, the clock moves forward, it'll be a bigger number.
        if (intOffset > (dtDate.getTimezoneOffset() * (-1))){
            intOffset = (dtDate.getTimezoneOffset() * (-1));
        }
    }

    return intOffset;
}

รับ TZ และ DST จาก JS (ผ่านทาง Back Back Machine)


สิ่งนี้ได้ผลสำหรับฉัน! อ่านความคิดเห็นภายใต้การโพสต์บล็อกสำหรับการปรับปรุงสองสามรหัส
arlomedia

สิ่งนี้จะยังคงส่งคืนออฟเซ็ตมาตรฐานสำหรับเขตเวลาเท่านั้นเช่น +02: 00 มันจะไม่ให้ข้อมูลที่เพียงพอในการกำหนดเขตเวลาของผู้ใช้เช่นหรือAfrica/Johannesburg Europe/Istanbulดูวิกิพีเดียแท็กเขตเวลา
Matt Johnson-Pint

32

ใช้วิธีของ Unkwntech ฉันเขียนฟังก์ชันโดยใช้ jQuery และ PHP นี่คือการทดสอบและใช้งานได้!

ในหน้า PHP ที่คุณต้องการให้เขตเวลาเป็นตัวแปรให้ใส่โค้ดบางส่วนใกล้กับส่วนบนของหน้า

<?php
    session_start();
    $timezone = $_SESSION['time'];
?>

นี่จะอ่านตัวแปรเซสชั่น "เวลา" ซึ่งตอนนี้เรากำลังจะสร้าง

ในหน้าเดียวกันใน <head> คุณต้องก่อนอื่นต้องรวม jQuery:

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>

นอกจากนี้ใน <head> ใต้ jQuery ให้วางสิ่งนี้:

<script type="text/javascript">
    $(document).ready(function() {
        if("<?php echo $timezone; ?>".length==0){
            var visitortime = new Date();
            var visitortimezone = "GMT " + -visitortime.getTimezoneOffset()/60;
            $.ajax({
                type: "GET",
                url: "http://example.org/timezone.php",
                data: 'time='+ visitortimezone,
                success: function(){
                    location.reload();
                }
            });
        }
    });
</script>

คุณอาจหรืออาจไม่ได้สังเกตเห็น แต่คุณต้องเปลี่ยน URL เป็นโดเมนจริงของคุณ

สิ่งสุดท้าย. คุณอาจสงสัยว่า heck timezone.php คืออะไร มันก็แค่นี้: (สร้างไฟล์ใหม่ที่ชื่อว่าtimezone.phpและชี้ไปที่ URL ด้านบน)

<?php
    session_start();
    $_SESSION['time'] = $_GET['time'];
?>

หากทำงานได้อย่างถูกต้องหน้าแรกจะโหลดหน้าใช้งาน JavaScript และโหลดหน้าเว็บซ้ำ จากนั้นคุณจะสามารถอ่านตัวแปร $ timezone และใช้เพื่อความสุขของคุณ! จะคืนค่าออฟเซ็ต UTC / GMT เขตเวลาปัจจุบัน (GMT -7) หรือเขตเวลาใด ๆ ที่คุณอยู่


ฉันทำสิ่งนี้ แต่ฉันอาจมีบางสิ่งบางอย่างที่ตรวจสอบ $ _SESSION ปัจจุบัน ['เวลา'] และรับเฉพาะ javascript ที่จะโหลดหากมันแตกต่างกัน
Christopher Chase

1
อาจเป็นการง่ายกว่าที่จะใช้คุกกี้มากกว่าเซสชันเพื่อขนส่งสิ่งนี้เนื่องจากการล็อกและยกเลิกการระบุเซสชัน PHP อาจทำให้แอปของคุณช้าลง เพื่อประสิทธิภาพสูงสุดคุณสามารถคัดลอกค่าลงในเซสชันและลบคุกกี้เพื่อไม่ให้ส่งในคำขอถัดไป
IMSoP

25

ในการส่งเขตเวลาชดเชยเป็นส่วนหัว HTTP ในคำขอ AJAX ด้วยjQuery

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        xhr.setRequestHeader("X-TZ-Offset", -new Date().getTimezoneOffset()/60);
    }
});

คุณสามารถทำสิ่งที่คล้ายกันเพื่อรับชื่อเขตเวลาจริงโดยใช้moment.tz.guess();จากhttp://momentjs.com/timezone/docs/#/using-timezones/guessing-user-timezone/


1
นี้จะส่งกลับปัจจุบันโซนเวลาชดเชย - ไม่โซนเวลา ดูวิกิพีเดียแท็กเขตเวลา
Matt Johnson-Pint

แก้ไขเพื่อรวมข้อมูลเกี่ยวกับการทำเช่นเดียวกันสำหรับชื่อเขตเวลา
philfreo

24

ฉันยังไม่เห็นคำตอบโดยละเอียดที่นี่เพื่อให้ได้เขตเวลา คุณไม่จำเป็นต้องระบุรหัสภูมิศาสตร์ด้วยที่อยู่ IP หรือใช้ PHP (lol) หรือเดาจาก offset อย่างไม่ถูกต้อง

ประการแรกเขตเวลาไม่ได้เป็นเพียงการชดเชยจาก GMT มันเป็นพื้นที่ของที่ดินที่กำหนดเวลาตามมาตรฐานท้องถิ่น บางประเทศมีเวลาออมแสงและจะเปิด DST ในเวลาที่ต่างกัน เป็นเรื่องสำคัญที่จะต้องได้รับโซนจริงไม่ใช่แค่ออฟเซ็ตปัจจุบัน

หากคุณตั้งใจจะจัดเก็บเขตเวลานี้ตัวอย่างเช่นในการตั้งค่าผู้ใช้ที่คุณต้องการโซนและไม่เพียง แต่การชดเชย สำหรับการแปลงเรียลไทม์มันไม่สำคัญมากนัก

ตอนนี้เพื่อรับโซนเวลาด้วย javascript คุณสามารถใช้สิ่งนี้:

>> new Date().toTimeString();
"15:46:04 GMT+1200 (New Zealand Standard Time)"
//Use some regular expression to extract the time.

อย่างไรก็ตามฉันพบว่าง่ายขึ้นเพียงใช้ปลั๊กอินที่มีประสิทธิภาพซึ่งส่งคืนเขตเวลาที่จัดรูปแบบ Olsen:

https://github.com/scottwater/jquery.detect_timezone


22

ด้วยdateฟังก์ชั่นPHP คุณจะได้รับวันเวลาที่เซิร์ฟเวอร์ตั้งอยู่ในเว็บไซต์ วิธีเดียวที่จะได้รับเวลาของผู้ใช้คือการใช้ JavaScript

แต่ฉันขอแนะนำให้คุณหากเว็บไซต์ของคุณต้องลงทะเบียนแล้ววิธีที่ดีที่สุดคือการขอให้ผู้ใช้ในขณะที่มีการลงทะเบียนเป็นเขตบังคับ คุณสามารถแสดงรายการโซนเวลาต่าง ๆ ในหน้าลงทะเบียนและบันทึกในฐานข้อมูล หลังจากนี้หากผู้ใช้ล็อกอินเข้าสู่เว็บไซต์คุณสามารถตั้งค่าโซนเวลาเริ่มต้นสำหรับเซสชันนั้นตามโซนเวลาที่ผู้ใช้เลือก

คุณสามารถตั้งค่าโซนเวลาที่เฉพาะเจาะจงใด ๆ date_default_timezone_setโดยใช้ฟังก์ชั่น ชุดนี้จะกำหนดเขตเวลาสำหรับผู้ใช้

โดยทั่วไปเขตเวลาของผู้ใช้จะไปที่ฝั่งไคลเอ็นต์ดังนั้นเราต้องใช้ JavaScript สำหรับสิ่งนี้

ด้านล่างเป็นสคริปต์เพื่อรับเขตเวลาของผู้ใช้โดยใช้ PHP และ JavaScript

<?php
    #http://www.php.net/manual/en/timezones.php List of Time Zones
    function showclienttime()
    {
        if(!isset($_COOKIE['GMT_bias']))
        {
?>

            <script type="text/javascript">
                var Cookies = {};
                Cookies.create = function (name, value, days) {
                    if (days) {
                        var date = new Date();
                        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
                        var expires = "; expires=" + date.toGMTString();
                    }
                    else {
                        var expires = "";
                    }
                    document.cookie = name + "=" + value + expires + "; path=/";
                    this[name] = value;
                }

                var now = new Date();
                Cookies.create("GMT_bias",now.getTimezoneOffset(),1);
                window.location = "<?php echo $_SERVER['PHP_SELF'];?>";
            </script>

            <?php

        }
        else {
          $fct_clientbias = $_COOKIE['GMT_bias'];
        }

        $fct_servertimedata = gettimeofday();
        $fct_servertime = $fct_servertimedata['sec'];
        $fct_serverbias = $fct_servertimedata['minuteswest'];
        $fct_totalbias = $fct_serverbias  $fct_clientbias;
        $fct_totalbias = $fct_totalbias * 60;
        $fct_clienttimestamp = $fct_servertime + $fct_totalbias;
        $fct_time = time();
        $fct_year = strftime("%Y", $fct_clienttimestamp);
        $fct_month = strftime("%B", $fct_clienttimestamp);
        $fct_day = strftime("%d", $fct_clienttimestamp);
        $fct_hour = strftime("%I", $fct_clienttimestamp);
        $fct_minute = strftime("%M", $fct_clienttimestamp);
        $fct_second = strftime("%S", $fct_clienttimestamp);
        $fct_am_pm = strftime("%p", $fct_clienttimestamp);
        echo $fct_day.", ".$fct_month." ".$fct_year." ( ".$fct_hour.":".$fct_minute.":".$fct_second." ".$fct_am_pm." )";
    }

    showclienttime();
?>

แต่ตามมุมมองของฉันมันจะดีกว่าที่จะถามผู้ใช้ว่าการลงทะเบียนเป็นสิ่งจำเป็นในโครงการของคุณหรือไม่


22

อย่าใช้ที่อยู่ IP เพื่อกำหนดสถานที่อย่างแน่นอน (และด้วยเหตุนี้) - เนื่องจาก NAT, พรอกซี (ความนิยมเพิ่มขึ้น) และ VPNs ที่อยู่ IP ไม่จำเป็นต้องสะท้อนถึงสถานที่จริงของผู้ใช้จริง เซิร์ฟเวอร์ที่ใช้โปรโตคอลเหล่านั้นอยู่

เช่นเดียวกับวิธีที่รหัสพื้นที่ในสหรัฐอเมริกาไม่มีประโยชน์สำหรับการค้นหาผู้ใช้โทรศัพท์อีกต่อไปเนื่องจากได้รับความนิยมในการพกพาหมายเลข

ที่อยู่ IP และเทคนิคอื่น ๆ ที่แสดงด้านบนมีประโยชน์ในการแนะนำค่าเริ่มต้นที่ผู้ใช้สามารถปรับ / แก้ไข


21

JavaScript:

function maketimus(timestampz)
{
    var linktime = new Date(timestampz * 1000);
    var linkday = linktime.getDate();
    var freakingmonths = new Array();

    freakingmonths[0]  = "jan";
    freakingmonths[1]  = "feb";
    freakingmonths[2]  = "mar";
    freakingmonths[3]  = "apr";
    freakingmonths[4]  = "may";
    freakingmonths[5]  = "jun";
    freakingmonths[6]  = "jul";
    freakingmonths[7]  = "aug";
    freakingmonths[8]  = "sep";
    freakingmonths[9]  = "oct";
    freakingmonths[10] = "nov";
    freakingmonths[11] = "dec";

    var linkmonthnum = linktime.getMonth();
    var linkmonth = freakingmonths[linkmonthnum];
    var linkyear = linktime.getFullYear();
    var linkhour = linktime.getHours();
    var linkminute = linktime.getMinutes();

    if (linkminute < 10)
    {
        linkminute = "0" + linkminute;
    }

    var fomratedtime = linkday + linkmonth + linkyear + " " +
                       linkhour + ":" + linkminute + "h";
    return fomratedtime;
}

เพียงระบุเวลาของคุณในรูปแบบเวลาประทับของ Unix ให้กับฟังก์ชันนี้ JavaScript ทราบเขตเวลาของผู้ใช้แล้ว

แบบนี้:

PHP:

echo '<script type="text/javascript">
var eltimio = maketimus('.$unix_timestamp_ofshiz.');
document.write(eltimio);
</script><noscript>pls enable javascript</noscript>';

การดำเนินการนี้จะแสดงเวลาอย่างถูกต้องตามเขตเวลาที่บุคคลนั้นตั้งไว้บนนาฬิกาคอมพิวเตอร์ของเขา / เธอ ไม่จำเป็นต้องขออะไรกับใครและบันทึกลงในสถานที่ขอบคุณพระเจ้า!


$ unix_timestamp_ofshiz? มีบางอย่างหายไปที่นี่และใช้งานไม่ได้แม้ว่าจะเป็นคำตอบที่ดีก็ตาม

20

ง่ายเพียงใช้getTimezoneOffsetฟังก์ชันJavaScript เช่นนั้น:

-new Date().getTimezoneOffset()/60;

1
นี่คือฟังก์ชัน Javascript ไม่ใช่ฟังก์ชัน PHP
cincodenada

นอกจากนี้ก็จะส่งกลับปัจจุบันโซนเวลาชดเชย - ไม่โซนเวลา ดูวิกิพีเดียแท็กเขตเวลา
Matt Johnson-Pint

3
นี่เป็นเพียงสำเนาของคำตอบที่ยอมรับได้ทำไมคุณถึงออกเสียงลงคะแนน
Rambatino

19

ความมหัศจรรย์ทั้งหมดดูเหมือนจะเป็นสิ่งต่อไปนี้

visitortime.getTimezoneOffset()

มันเยี่ยมมากฉันไม่รู้เรื่องนั้นเลย ใช้งานได้ใน Internet Explorer หรือไม่? จากตรงนั้นคุณควรจะสามารถใช้ JavaScript เป็น Ajax ตั้งค่าคุกกี้ได้ ฉันอาจไปเส้นทางคุกกี้ด้วยตัวเอง

คุณจะต้องอนุญาตให้ผู้ใช้เปลี่ยนได้ เราพยายามใช้ตำแหน่งทางภูมิศาสตร์ (ผ่าน maxmind) เพื่อทำสิ่งนี้มานานแล้วและมันก็ผิดบ่อยพอ - พอที่จะทำให้มันไม่คุ้มค่าดังนั้นเราจึงให้ผู้ใช้ตั้งค่าไว้ในโปรไฟล์ของพวกเขาและแสดงการแจ้งเตือนผู้ใช้ที่ ยังไม่ได้ตั้งค่า


15

นี่คือบทความ (พร้อมซอร์สโค้ด) ที่อธิบายวิธีการตรวจสอบและใช้เวลาในภาษาท้องถิ่นในแอปพลิเคชัน ASP.NET (VB.NET, C #):

มันขึ้นอยู่กับเวลา

ในระยะสั้นวิธีการที่อธิบายจะขึ้นอยู่กับgetTimezoneOffsetฟังก์ชั่นJavaScript ซึ่งจะส่งคืนค่าที่บันทึกไว้ในคุกกี้เซสชั่นและใช้โดยการใช้โค้ดเพื่อปรับค่าเวลาระหว่าง GMT และเวลาท้องถิ่น สิ่งที่ดีคือผู้ใช้ไม่จำเป็นต้องระบุเขตเวลา (รหัสจะทำโดยอัตโนมัติ) มีส่วนร่วมมากขึ้น (นี่คือเหตุผลที่ฉันเชื่อมโยงไปยังบทความ) แต่รหัสที่ให้ทำให้ใช้งานง่าย ฉันสงสัยว่าคุณสามารถแปลงตรรกะเป็น PHP และภาษาอื่น ๆ (ตราบเท่าที่คุณเข้าใจ ASP.NET)


1
ลิงก์ตาย ฉันคิดว่านี่เป็นลิงค์สำรอง: devproconnections.com/article/aspnet2/it-s-about-time-122778
Gan

1
บทความนี้มีให้ในรูปแบบ PDF ที่นี่เช่นกัน: app.box.com/shared/bfvvmidtyg
Ivaylo Slavov

วิธีการแปลงเวลาเซิร์ฟเวอร์ UTC เป็นเวลาท้องถิ่นของลูกค้าที่อธิบายไว้ในบทความนี้ไม่ถูกต้อง การใช้ไคลเอนต์ปัจจุบันออฟเซ็ตเพื่อปรับเวลา UTC บนเซิร์ฟเวอร์จะส่งผลให้เวลา "ท้องถิ่น" ไม่ถูกต้องเป็นเวลาครึ่งปีสำหรับตำแหน่งที่ตั้งลูกค้าที่สังเกตเวลาออมแสง พิจารณาสถานการณ์นี้: ลูกค้าในสหราชอาณาจักรในวันที่ 14 มกราคม 2013 (GMT + 0000 เวลามาตรฐาน) กำหนดวันและเวลา 21 ส.ค. 2558 14:00 น. (GMT + 0100 เวลาตามฤดูกาล) สิ่งนี้ได้รับการทำให้เป็นมาตรฐานบนเซิร์ฟเวอร์ถึง 21 สิงหาคม 2558 13:00 UTC ในวันที่สิ่งนี้เกิดขึ้นลูกค้าชดเชยเป็น 0 ดังนั้นเวลาที่ส่งกลับไปยังลูกค้าจะเป็น 21 สิงหาคม 2558 13:00
สตีเฟ่นแบลร์

จุดที่ถูกต้อง แต่ฉันไม่ได้อ้างว่านี่เป็นวิธีแก้ปัญหากระสุน หากคุณต้องการใช้โซลูชั่นที่คำนึงถึงเวลาจริง ๆ พูดโปรแกรมจองตั๋วรถไฟแล้วคุณต้องหาโซลูชันที่ครอบคลุมมากขึ้น (และวิธีแก้ปัญหาที่ซับซ้อน) อย่างไรก็ตามสำหรับแอพจำนวนมากสิ่งนี้จะไม่เป็นปัญหา เพราะในหลายกรณีเราต้องการ จำกัด ค่า GMT สำหรับเซสชันปัจจุบัน ตอนนี้ถ้าคุณมีแอปพลิเคชันที่ต้องการบันทึกการประทับเวลาสำหรับบางคนในอนาคตและไม่สามารถทนต่อ DTS ได้วิธีที่เหมาะสมคือการนำเสนอตัวเลือกเพื่อประหยัดเวลาโดยตรงใน GMT หากคุณรู้จักตัวเลือกที่ดีกว่านี้โปรดแชร์
Alek Davis

14

หากคุณกำลังใช้OpenIDสำหรับการตรวจสอบสิทธิ์Simple Registration Extensionจะช่วยแก้ปัญหาสำหรับผู้ใช้ที่ผ่านการตรวจสอบสิทธิ์แล้ว (คุณจะต้องแปลงจาก tz เป็นตัวเลข)

ตัวเลือกอื่นคือการอนุมานเขตเวลาจากการตั้งค่าประเทศของตัวแทนผู้ใช้ นี่เป็นวิธีที่ค่อนข้างหยาบ (ใช้ไม่ได้กับ en-US) แต่ทำการประมาณได้ดี


13

มันง่ายด้วย JavaScript และ PHP:

แม้ว่าผู้ใช้สามารถยุ่งกับนาฬิกาภายในและ / หรือเขตเวลาของเขา / เธอวิธีที่ดีที่สุดที่ฉันพบเพื่อให้ได้รับการชดเชยยังคงอยู่ new Date().getTimezoneOffset();หรือเขตเวลาวิธีการที่ดีที่สุดที่ฉันพบเพื่อให้ห่างไกลจะได้รับการชดเชยซาก มันไม่รุกรานไม่ให้ปวดหัวและไม่จำเป็นต้องพึ่งพาบุคคลที่สาม

สมมติว่าฉันมีตารางusersที่มีเขตข้อมูลdate_created int(13)สำหรับการจัดเก็บเวลาประทับของ Unix

สมมติว่าลูกค้าcreates a new accountข้อมูลจะได้รับจากpostและฉันต้องinsert/updatedate_created column Unix timestamp ของลูกค้าไม่ใช่ของเซิร์ฟเวอร์

เนื่องจากจำเป็นต้องใช้ timezoneOffset ณ เวลาที่แทรก / อัปเดตจึงถูกส่งเป็นองค์ประกอบ $ _POST พิเศษเมื่อลูกค้าส่งแบบฟอร์มจึงไม่จำเป็นต้องเก็บไว้ในเซสชันและ / หรือคุกกี้

var off = (-new Date().getTimezoneOffset()/60).toString();//note the '-' in front which makes it return positive for negative offsets and negative for positive offsets
var tzo = off == '0' ? 'GMT' : off.indexOf('-') > -1 ? 'GMT'+off : 'GMT+'+off;

สมมติว่าเซิร์ฟเวอร์ได้รับtzoเป็น$_POST['tzo'];

$ts = new DateTime('now', new DateTimeZone($_POST['tzo']);
$user_time = $ts->format("F j, Y, g:i a");//will return the users current time in readable format, regardless of whether date_default_timezone() is set or not.
$user_timestamp = strtotime($user_time);

แทรก / ปรับปรุง date_created=$user_timestampแทรก

เมื่อดึงข้อมูล date_created คุณสามารถแปลงการประทับเวลาดังนี้:

$date_created = // Get from the database
$created = date("F j, Y, g:i a",$date_created); // Return it to the user or whatever

ตอนนี้ตัวอย่างนี้อาจตรงกับความต้องการของคนเมื่อมันมาถึงการแทรกการfirstประทับเวลา ... เมื่อมันมาถึงการประทับเวลาเพิ่มเติมหรือตารางคุณอาจต้องการพิจารณาการแทรกค่า tzo ในตารางผู้ใช้สำหรับการอ้างอิงในอนาคตหรือการตั้งค่า เป็นเซสชั่นหรือเป็นคุกกี้

PS แต่จะเกิดอะไรขึ้นถ้าผู้ใช้เดินทางและสลับเขตเวลา เข้าสู่ระบบที่ GMT + 4 เดินทางรวดเร็วไปยัง GMT-1 และเข้าสู่ระบบอีกครั้ง การเข้าสู่ระบบครั้งสุดท้ายจะเป็นในอนาคต

ฉันคิดว่า ... เราคิดมากเกินไป


13

คุณสามารถทำได้บนไคลเอนต์ที่มีช่วงเวลาและส่งค่าไปยังเซิร์ฟเวอร์ การใช้งานตัวอย่าง:

> moment.tz.guess()
"America/Asuncion"

5
ชื่อฟังก์ชั่นบอกทุกอย่างเกี่ยวกับความแม่นยำ ;-)
ตำนาน

ทุกวันนี้ moment.js ฉันไม่แนะนำอีกต่อไป มีทางเลือกน้อยกว่าในปัจจุบัน ( dayjs , date-fns ) ช่วงเวลาที่มีขนาดใหญ่มาก
Dan Dascalescu

11

การรับชื่อเขตเวลาฐานข้อมูล TZ ที่ถูกต้องใน PHP เป็นกระบวนการสองขั้นตอน:

  1. ด้วย JavaScript getTimezoneOffsetได้รับการชดเชยในเขตเวลานาทีผ่าน ออฟเซ็ตนี้จะเป็นค่าบวกหากเขตเวลาท้องถิ่นอยู่หลัง UTC และลบหากอยู่ข้างหน้า ดังนั้นคุณต้องเพิ่มเครื่องหมายตรงข้ามกับออฟเซ็ต

    var timezone_offset_minutes = new Date().getTimezoneOffset();
    timezone_offset_minutes = timezone_offset_minutes == 0 ? 0 : -timezone_offset_minutes;

    ผ่าน offset นี้ไปยัง PHP

  2. ใน PHP แปลงออฟเซ็ตนี้เป็นชื่อเขตเวลาที่ถูกต้องด้วยฟังก์ชั่นtimezone_name_from_abbr

    // Just an example.
    $timezone_offset_minutes = -360;  // $_GET['timezone_offset_minutes']
    
    // Convert minutes to seconds
    $timezone_name = timezone_name_from_abbr("", $timezone_offset_minutes*60, false);
    
    // America/Chicago
    echo $timezone_name;</code></pre>

ผมเคยเขียนบล็อกโพสต์เกี่ยวกับมัน: วิธีการตรวจสอบเขตเวลาของผู้ใช้ใน PHP นอกจากนี้ยังมีตัวอย่าง


1
ฉันคิดว่ากระบวนการที่ง่ายกว่าคือการโทรIntl.DateTimeFormat().resolvedOptions().timeZoneและส่งไปยังเว็บเซิร์ฟเวอร์ Ref: stackoverflow.com/questions/9772955/…
Michael Tsang

9

วิธีง่ายๆในการทำคือใช้:

new Date().getTimezoneOffset();

8
คุณไม่ repost ทำไมคำตอบเหมือนกัน (โดยจอห์น Isaacks) จาก 2 ปีที่ผ่านมา: stackoverflow.com/a/1809974/836407 ?
chown

2
นอกจากนี้ก็จะส่งกลับปัจจุบันโซนเวลาชดเชย - ไม่โซนเวลา ดูวิกิพีเดียแท็กเขตเวลา
Matt Johnson-Pint

8

ตัวเลือกหนึ่งที่เป็นไปได้คือการใช้Dateฟิลด์ส่วนหัวซึ่งกำหนดไว้ในRFC 7231และควรรวมเขตเวลาไว้ด้วย แน่นอนว่าไม่รับประกันว่าค่านี้จะเป็นเขตเวลาของลูกค้า แต่เป็นจุดเริ่มต้นที่สะดวก


1
น่าเสียดายที่ส่วนหัวนั้นดูเหมือนว่าได้รับการออกแบบมาเป็นหลักสำหรับการตอบสนองไม่ใช่การร้องขอ: "ตัวแทนผู้ใช้อาจส่งฟิลด์ส่วนหัวของวันที่ในการร้องขอ แต่โดยทั่วไปจะไม่ทำเช่นนั้น ฉันเพิ่งตรวจสอบและ Firefox จะไม่ส่ง
IMSoP

8

นี่คือวิธีที่ฉันทำ สิ่งนี้จะตั้งค่าเขตเวลาเริ่มต้นของ PHP เป็นเขตเวลาท้องถิ่นของผู้ใช้ เพียงวางต่อไปนี้ไว้ด้านบนของทุกหน้าของคุณ:

<?php
session_start();

if(!isset($_SESSION['timezone']))
{
    if(!isset($_REQUEST['offset']))
    {
    ?>
        <script>
        var d = new Date()
        var offset= -d.getTimezoneOffset()/60;
        location.href = "<?php echo $_SERVER['PHP_SELF']; ?>?offset="+offset;
        </script>
        <?php   
    }
    else
    {
        $zonelist = array('Kwajalein' => -12.00, 'Pacific/Midway' => -11.00, 'Pacific/Honolulu' => -10.00, 'America/Anchorage' => -9.00, 'America/Los_Angeles' => -8.00, 'America/Denver' => -7.00, 'America/Tegucigalpa' => -6.00, 'America/New_York' => -5.00, 'America/Caracas' => -4.30, 'America/Halifax' => -4.00, 'America/St_Johns' => -3.30, 'America/Argentina/Buenos_Aires' => -3.00, 'America/Sao_Paulo' => -3.00, 'Atlantic/South_Georgia' => -2.00, 'Atlantic/Azores' => -1.00, 'Europe/Dublin' => 0, 'Europe/Belgrade' => 1.00, 'Europe/Minsk' => 2.00, 'Asia/Kuwait' => 3.00, 'Asia/Tehran' => 3.30, 'Asia/Muscat' => 4.00, 'Asia/Yekaterinburg' => 5.00, 'Asia/Kolkata' => 5.30, 'Asia/Katmandu' => 5.45, 'Asia/Dhaka' => 6.00, 'Asia/Rangoon' => 6.30, 'Asia/Krasnoyarsk' => 7.00, 'Asia/Brunei' => 8.00, 'Asia/Seoul' => 9.00, 'Australia/Darwin' => 9.30, 'Australia/Canberra' => 10.00, 'Asia/Magadan' => 11.00, 'Pacific/Fiji' => 12.00, 'Pacific/Tongatapu' => 13.00);
        $index = array_keys($zonelist, $_REQUEST['offset']);
        $_SESSION['timezone'] = $index[0];
    }
}

date_default_timezone_set($_SESSION['timezone']);

//rest of your code goes here
?>

1
นี่ไม่ใช่บัญชีสำหรับการปรับ "การปรับเวลาตามฤดูกาล" - ผู้ใช้ในดับลินจะจับคู่ 'ยุโรป / ดับลิน' ของคุณในฤดูหนาว แต่ 'ยุโรป / เบลเกรด' ในฤดูร้อน หากคุณกำลังจะใช้การชดเชยปัจจุบันสิ่งที่คุณพอจะสันนิษฐานได้ก็คือการชดเชยนั้นไม่ใช่ตัวบ่งชี้ทางภูมิศาสตร์
IMSoP

8

ลองโค้ด PHP นี้:

<?php
    $ip = $_SERVER['REMOTE_ADDR'];
    $json = file_get_contents("http://api.easyjquery.com/ips/?ip=" . $ip . "&full=true");
    $json = json_decode($json,true);
    $timezone = $json['LocalTimeZone'];
?>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.