ฉันจะรับชื่อเขตเวลาใน JavaScript ได้อย่างไร


123

ฉันรู้วิธีการชดเชยเขตเวลา แต่สิ่งที่ฉันต้องการคือความสามารถในการตรวจจับบางอย่างเช่น "อเมริกา / นิวยอร์ก" เป็นไปได้หรือไม่จาก JavaScript หรือเป็นสิ่งที่ฉันจะต้องทำให้เป็นแบบแขกรับเชิญตามออฟเซ็ต?


2
นี่คือฟังก์ชั่นที่ Jon Nylander เขียนบางทีมันอาจช่วยbitbucket.org/pellepim/jstimezonedetect
yunzen

นี่คือคำตอบที่เกี่ยวข้องซึ่งอาจช่วยได้: stackoverflow.com/a/19421672/1447034
Douglas

คำตอบ:


257

สากล APIสนับสนุนได้รับเขตเวลาของผู้ใช้และได้รับการสนับสนุนในเบราว์เซอร์ในปัจจุบันทั้งหมด

console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)

โปรดทราบว่าในเบราว์เซอร์เวอร์ชันเก่าบางเวอร์ชันที่รองรับ Internationalization API timeZoneคุณสมบัตินี้จะถูกตั้งค่าundefinedเป็นสตริงเขตเวลาของผู้ใช้แทน ดีที่สุดเท่าที่ฉันสามารถบอกได้ในขณะที่เขียน (กรกฎาคม 2017) เบราว์เซอร์ปัจจุบันทั้งหมดยกเว้น IE11จะส่งคืนเขตเวลาของผู้ใช้เป็นสตริง


6
ไม่เคยคิดว่ามันจะง่ายขนาดนี้มาก่อน
Mohammed Shareef C

5
สุดยอดคนแรกที่ฉันเคยเห็นที่ไม่ใช้โมเมนต์! ขอบคุณ
r0bb077

3
ทางออกที่ยอดเยี่ยม ไม่ต้องการรวมปลั๊กอินเขตเวลาช่วงเวลาทั้งหมดสำหรับสิ่งนี้
Joan Gil

1
วิธีแก้ปัญหาที่ง่ายและดีมาก!
blackiii

2
@DanielCompton โอ้ฉันไม่รู้เกี่ยวกับตารางนี้ขอบคุณสำหรับการแก้ไขอีกครั้ง
CommonSenseCode

10

คำตอบที่ได้รับการโหวตมากที่สุดน่าจะเป็นวิธีที่ดีที่สุดในการรับเขตเวลาอย่างไรก็ตามIntl.DateTimeFormat().resolvedOptions().timeZoneส่งคืนชื่อเขตเวลา IANA ตามคำจำกัดความซึ่งเป็นภาษาอังกฤษ

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

function getTimezoneName() {
  const today = new Date();
  const short = today.toLocaleDateString(undefined);
  const full = today.toLocaleDateString(undefined, { timeZoneName: 'long' });

  // Trying to remove date from the string in a locale-agnostic way
  const shortIndex = full.indexOf(short);
  if (shortIndex >= 0) {
    const trimmed = full.substring(0, shortIndex) + full.substring(shortIndex + short.length);
    
    // by this time `trimmed` should be the timezone's name with some punctuation -
    // trim it from both sides
    return trimmed.replace(/^[\s,.\-:;]+|[\s,.\-:;]+$/g, '');

  } else {
    // in some magic case when short representation of date is not present in the long one, just return the long one as a fallback, since it should contain the timezone's name
    return full;
  }
}

console.log(getTimezoneName());

ทดสอบใน Chrome และ Firefox

แน่นอนสิ่งนี้จะไม่ทำงานตามที่ตั้งใจไว้ในบางสภาพแวดล้อม ตัวอย่างเช่น node.js ส่งคืนค่าชดเชย GMT (เช่นGMT+07:00) แทนชื่อ แต่ฉันคิดว่ามันยังอ่านได้ในฐานะทางเลือก

PS จะไม่ทำงานใน IE11 เช่นเดียวกับIntl...โซลูชัน


6

คุณสามารถใช้สคริปต์นี้ http://pellepim.bitbucket.org/jstz/

ที่เก็บส้อมหรือโคลนที่นี่ https://bitbucket.org/pellepim/jstimezonedetect

เมื่อคุณรวมสคริปต์แล้วคุณจะได้รับรายชื่อเขตเวลาในjstz.olson.timezonesตัวแปร-

และรหัสต่อไปนี้ใช้เพื่อกำหนดเขตเวลาของเบราว์เซอร์ไคลเอนต์

var tz = jstz.determine();
tz.name();

สนุกกับ jstz!


4

ดึงเขตเวลาตามชื่อ (เช่น "America / New York")

moment.tz.guess();

13
โปรดระบุว่ามันเป็นไปได้โดยไม่ต้องพึ่งพาใด ๆ :Intl.DateTimeFormat().resolvedOptions().timeZone
user2923322

1
ใช่แม้ว่า moment-js จะคาดเดา TZ สำหรับ "เบราว์เซอร์" ที่ไม่รองรับคุณลักษณะนั้น :)
Ferran Maylinch

ใน IE11 Intl.DateTimeFormat().resolvedOptions().timeZoneให้กลับundefinedแต่moment.tz.guess()ส่งคืนค่าที่ถูกต้อง
Antoni4

0

คุณสามารถเขียนโค้ดของคุณเองโดยใช้ตารางการทำแผนที่ที่นี่: http://www.timeanddate.com/time/zones/

หรือใช้ห้องสมุดเขตเวลาช่วงเวลา: http://momentjs.com/timezone/docs/

ดู zone.name; // America/Los_Angeles

หรือไลบรารีนี้: https://github.com/Canop/tzdetect.js


4
ไม่มีประโยชน์อย่างยิ่งเนื่องจากเขตเวลาหลายเขตมีออฟเซ็ตเดียวกัน
bmerigan

0

สิ่งนี้ได้รับรหัสเขตเวลา (เช่นGMT) ในจาวาสคริปต์รุ่นเก่า (ฉันใช้สคริปต์แอป Google กับเอ็นจิ้นเก่า):

function getTimezoneName() {
  return new Date().toString().get(/\((.+)\)/);
}

ฉันแค่วางไว้ตรงนี้เผื่อมีคนต้องการ


1
ฉันคิดว่าใช้ได้กับUTC/ GMT. ดูเหมือนคนอื่นจะสะกด เช่นPacific Daylight Time.
Ian Dunn

-1

ลองใช้รหัสนี้อ้างอิงจากที่นี่

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js">
</script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.4/jstz.min.js">
</script>
<script type="text/javascript">
  $(document).ready(function(){
    var tz = jstz.determine(); // Determines the time zone of the browser client
    var timezone = tz.name(); //'Asia/Kolhata' for Indian Time.

    alert(timezone);
});
</script>

-5

ใน javascript เมธอด Date.getTimezoneOffset () จะคืนค่าออฟเซ็ตโซนเวลาจาก UTC เป็นนาทีสำหรับโลแคลปัจจุบัน

var x = new Date();
var currentTimeZoneOffsetInHours = x.getTimezoneOffset() / 60;

Moment'timezone จะเป็นเครื่องมือที่มีประโยชน์ http://momentjs.com/timezone/

แปลงวันที่ระหว่างเขตเวลา

var newYork    = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");
var london     = newYork.clone().tz("Europe/London");

newYork.format();    // 2014-06-01T12:00:00-04:00
losAngeles.format(); // 2014-06-01T09:00:00-07:00
london.format();     // 2014-06-01T17:00:00+01:00

4
คุณไม่เข้าใจคิว
srsajid

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