รับเขตเวลาของลูกค้าใน JavaScript


614

ฉันจะรวบรวมข้อมูลเขตเวลาของผู้เยี่ยมชมได้อย่างไร ฉันต้องการเขตเวลารวมถึงเวลาชดเชยเวลา GMT


3
ฉันกำลังหาปัญหาเดียวกันตอนนี้ นี่คือวิธีการที่น่าสนใจ
Tamás Pap

31
ชื่อขอเขตเวลาในขณะที่ข้อความขอชดเชย GMT นี่คือ 2 สิ่งที่แตกต่างกัน เขตเวลามีข้อมูลเกี่ยวกับ DST, utc offset ไม่ เขตเวลามีชื่อและประวัติตรงข้ามไม่มี แนะนำให้แก้ไขชื่อเรื่องเพื่อ "รับ gmt offset ของลูกค้าใน JS"
citykid

ฉันต้องการเขตเวลา การชดเชยเวลา GMT จะเป็นประโยชน์เช่นกัน
DaveWalley

9
คำตอบที่นี่มุ่งเน้นส่วนใหญ่ในการชดเชย สำหรับเขตเวลาดูคำตอบนี้ โปรดดูที่ "โซนเวลา! = Offset" ในวิกิพีเดียแท็กเขตเวลา
Matt Johnson-Pint

7
คุณจะได้รับเขตเวลาที่แน่นอนโดยใช้ Intl.DateTimeFormat (). modifiedOptions (). timeZone
Mangesh Mandavgane

คำตอบ:


594

var offset = new Date().getTimezoneOffset();
console.log(offset);

ออฟเซ็ตเขตเวลาคือความแตกต่างเป็นนาทีระหว่าง UTC กับเวลาท้องถิ่น โปรดทราบว่านี่หมายความว่าการชดเชยเป็นค่าบวกหากเขตเวลาท้องถิ่นอยู่หลัง UTC และลบหากอยู่ข้างหน้า ตัวอย่างเช่นหากเขตเวลาของคุณคือ UTC + 10 (เวลามาตรฐานทางตะวันออกของออสเตรเลีย), -600 จะถูกส่งกลับ เวลาออมแสงตามฤดูกาลป้องกันค่านี้จากการเป็นค่าคงที่แม้สำหรับสถานที่ที่กำหนด

โปรดทราบว่าเขตเวลาทั้งหมดไม่ได้รับการชดเชยตามชั่วโมงทั้งหมด: ตัวอย่างเช่นนิวฟันด์แลนด์เป็น UTC ลบ 3h 30m (ปล่อยให้ปรับเวลาตามฤดูกาลออกจากสมการ)


42
@abernier ข้อความเกี่ยวกับgetTimezoneOffsetความไม่ถูกต้องมีผลหรือไม่ บทความที่คุณอ้างถึงคือวันที่เดือนมิถุนายน 2007 และไม่มีรายละเอียดของวิธีการที่ฟังก์ชั่นไม่ถูกต้อง และในความเป็นจริงแล้วห้องสมุดที่jsTimezoneDetectคุณชี้ใช้getTimezoneOffsetนั้น
Mike

5
@abernier มันเป็นมาตรฐานตั้งแต่ ES 1 ดังนั้นฉันมั่นใจว่าปัญหาการติดตั้งใด ๆ อาจได้รับการแก้ไขแล้วในตอนนี้ฉันหมายความว่านั่นเป็นบทความอายุ 7 ปี
LasagnaAndroid

49
var hrs = -(new Date().getTimezoneOffset() / 60) เพื่อชดเชยเวลาปกติที่ใช้
Edwin Daniels

6
ดูเหมือนจะไม่พิจารณาการปรับเวลาตามฤดูกาล
Shahdat

21
timezone! =utc offset
bendytree

482

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

ในการรับเขตเวลาของIANAของระบบใน JavaScript คุณควรใช้

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

ณ สิ้นเดือนกันยายน 2019 นี้ทำงานใน 95% ของเบราว์เซอร์ที่ใช้ทั่วโลก

ข้อมูลความเข้ากันได้เก่า

ecma-402 / 1.0 บอกว่าtimeZoneอาจไม่ได้กำหนดหากไม่ได้จัดไว้ให้กับ constructor อย่างไรก็ตามร่างอนาคต (3.0) แก้ไขปัญหาดังกล่าวโดยเปลี่ยนเป็นเขตเวลาเริ่มต้นของระบบ

ในรุ่นของ ECMAScript สากล API นี้ timeZoneคุณสมบัติที่จะยังคงอยู่ไม่ได้กำหนดหากไม่มีtimeZoneคุณสมบัติที่ได้รับการจัดให้อยู่ในตัวเลือกวัตถุให้กับIntl.DateTimeFormatคอนสตรัค อย่างไรก็ตามแอปพลิเคชันไม่ควรใช้สิ่งนี้เนื่องจากเวอร์ชันในอนาคตอาจส่งคืนค่าสตริงที่ระบุโซนเวลาปัจจุบันของสภาพแวดล้อมโฮสต์แทน

ใน ecma-402 / 3.0 ซึ่งยังอยู่ในร่างมันเปลี่ยนเป็น

ใน ECMAScript 2015 Internationalization API รุ่น timeZoneนี้คุณสมบัตินี้จะเป็นชื่อของเขตเวลาเริ่มต้นหากไม่มีการระบุ timeZoneคุณสมบัติในวัตถุตัวเลือกที่มีให้กับตัว Intl.DateTimeFormatสร้าง รุ่นก่อนหน้านี้ปล่อยให้ timeZoneคุณสมบัติไม่ได้กำหนดในกรณีนี้


17
นี่เป็นคำตอบเดียวสำหรับการรับเขตเวลาซึ่งผู้ใช้บางรายอาจต้องการเมื่อเทียบกับออฟเซ็ตเท่านั้น ดังนั้นในการอัปเดตในปี 2016-09 Intl ทำงานกับเบราว์เซอร์ที่ทันสมัยที่สุด แต่ไม่ใช่ Safari สำหรับเบราว์เซอร์นั้นมีตัวเลือกจาวาสคริปต์ที่ถูกต้องเหมาะสมที่นี่ - pellepim.bitbucket.org/jstz
2085368

6
ยืนยันว่าตอนนี้ดูเหมือนว่าจะทำงานใน Safari (ใช้รุ่น 10.0)
BadPirate

2
คงจะดีถ้ามันใช้ได้กับเบราว์เซอร์ที่ทันสมัยทั้งหมด อย่างไรก็ตาม IE11 และ Firefox รุ่นล่าสุดทั้งคู่กลับไม่ได้กำหนดสำหรับคุณสมบัติเขตเวลา
Haprog

7
ฉันได้ทำการทดสอบกับ Chrome 58, Edge 40 และ Firefox 53 แล้ว - มันจะใช้ได้ทั้งหมด มันไม่ทำงานกับ IE 11 ฉันไม่ได้ทดสอบ Opera
Suma

8
ฉันใช้เวลาสักครู่หนึ่งในการค้นหารายการเขตเวลาที่ API คืนมา นี่คือ: en.wikipedia.org/wiki/List_of_tz_database_time_zones
Xavier Poinas

123

ฉันรู้ว่าคำตอบนี้เป็นหัวข้อที่ค่อนข้างเล็กน้อย แต่ฉันคิดว่าพวกเราหลายคนกำลังมองหาคำตอบที่ต้องการจัดรูปแบบเขตเวลาสำหรับการแสดงผลและอาจได้รับตัวย่อของโซนด้วย ดังนั้นที่นี่มันจะไป ...

หากคุณต้องการให้เขตเวลาของไคลเอ็นต์อยู่ในรูปแบบที่ดีคุณสามารถใช้วิธีการ Date.toString ของ JavaScript และทำสิ่งต่อไปนี้

var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];

สิ่งนี้จะให้ "GMT-0400 (EST)" แก่คุณรวมถึงนาทีของเขตเวลาหากมี

อีกวิธีหนึ่งด้วย regex คุณสามารถแยกส่วนที่ต้องการ:

สำหรับ "GMT-0400 (EDT)":

new Date().toString().match(/([A-Z]+[\+-][0-9]+.*)/)[1]

สำหรับ "GMT-0400":

new Date().toString().match(/([A-Z]+[\+-][0-9]+)/)[1]

สำหรับ "EDT" เพียง:

new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]

เพียงแค่ "-0400":

new Date().toString().match(/([-\+][0-9]+)\s/)[1]

วันที่สำหรับการอ้างอิงถึง: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString


4
แตกกับ Chrome เมื่อต่อท้ายชื่อของเขตเวลา อย่าใช้ split.length แต่เป็นค่าคงที่แทนsplit[4] + " " + split[5]!
Christophe Roussy

4
สิ่งนี้ยังใช้ไม่ได้ใน (แปลกใจประหลาดใจ) IE ฉันเพิ่งถ่ายโอนข้อมูลคอนโซลของวัตถุ Date ที่แยกแล้ว มันเหมือนกันใน Chrome, Firefox และ Safari แต่แตกต่างกันใน IE ดังนั้นคุณไม่สามารถนับดัชนีคงที่ได้เช่นกัน วันจันทร์ที่ 02 2013 10:22:50 GMT-0500 (EST): Chrome, FF, Safari; จันทร์ 2 ธันวาคม 10:22:50 EST 2013: IE10
adimauro

1
เอ้ยขอบคุณ! ฉันกระโดดผ่านห่วงที่พยายามแสดงเขตเวลาของเบราว์เซอร์ ..... ew Date (). toString (). match (/ ([AZ] + [\ + -] [0-9] +. *) /) [ 1] คือสิ่งที่ฉันต้องการ!
KiwiSunGoddess

1
มันใช้งานไม่ได้ สำหรับฉันsplitมี: ["Mon", "Mar", "13", "2017", "14:05:22", "GMT-0400", "(Eastern", "Daylight", "Time)"]ดังนั้นผลลัพธ์คือDaylight Time)
DLeh

7
จริง ๆ แล้วไม่ใช่ความคิดที่ดีการแสดงเวลา JS จริง ๆ หลังจากที่คุณทำnew Date().toString()ขึ้นอยู่กับการตั้งค่าตำแหน่งที่ตั้งของคุณอย่างสมบูรณ์ การคาดหวังผลลัพธ์ของลูกค้ารายอื่นเพื่อให้ดูเหมือนคุณเป็นความคิดที่แย่มาก
Octopus

71

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

function pad(number, length){
    var str = "" + number
    while (str.length < length) {
        str = '0'+str
    }
    return str
}

var offset = new Date().getTimezoneOffset()
offset = ((offset<0? '+':'-')+ // Note the reversed sign!
          pad(parseInt(Math.abs(offset/60)), 2)+
          pad(Math.abs(offset%60), 2))

1
คุณจำเป็นต้องแทนที่ช่องว่างภายในที่ 1 ด้วยpad(parseInt(Math.abs(offset/60)), 2)เพื่อให้ถูกต้อง ... มิฉะนั้นคุณอาจได้รับ +5.530 เหมือนในกรณีของฉัน ... ฉันไม่แน่ใจว่าคณิตศาสตร์พื้น ฯลฯ จะเป็นสิ่งที่ดีกว่าที่นี่หรือไม่ .... แต่นี่ atleast ให้ฉัน +0530 ตามที่คาดไว้
Abhinav Singh

สิ่งที่ฉันค้นหา ขอบคุณมาก!
codesnooker

สิ่งนี้จะให้ผลลัพธ์ที่ถูกต้อง: this.pad (Math.floor ((Math.abs (offset / 60))), 2)
Vivek

แทนที่จะใช้ฟังก์ชั่นแพดของคุณฉันพบว่าทำสิ่งนี้ได้ง่ายขึ้น: offset = (ชดเชย <0? "+": "-") + ("0000" + parseInt ((Math.abs (offset / 60)))) .slice (-4)
flurbius

67

คุณสามารถใช้ได้:

ขณะ-เขตเวลา

<script src="moment.js"></script>
<script src="moment-timezone-with-data.js"></script>

// retrieve timezone by name (i.e. "America/Chicago")
moment.tz.guess();

การตรวจสอบโซนเวลาของเบราว์เซอร์ค่อนข้างยุ่งยากในการทำให้ถูกต้องเนื่องจากมีข้อมูลเล็กน้อยจากเบราว์เซอร์

ช่วงเวลาที่ใช้เขตเวลาDate.getTimezoneOffset()และDate.toString()ในช่วงเวลาไม่กี่คนของรอบปีปัจจุบันเพื่อรวบรวมเป็นข้อมูลเกี่ยวกับสภาพแวดล้อมของเบราว์เซอร์ที่เป็นไปได้ จากนั้นจะเปรียบเทียบข้อมูลนั้นกับข้อมูลเขตเวลาทั้งหมดที่โหลดและส่งคืนการจับคู่ที่ใกล้เคียงที่สุด ในกรณีที่มีความสัมพันธ์กันเขตเวลาของเมืองที่มีประชากรมากที่สุดจะถูกส่งคืน

console.log(moment.tz.guess()); // America/Chicago

12
นี่ควรเป็นคำตอบที่ยอมรับได้ นี่เป็นชื่อเดียวที่ให้ชื่อเขตเวลาจริงแทนที่จะเป็นการชดเชย โปรดจำไว้ว่าการชดเชยเขตเวลาสามารถได้มาจากชื่อตรงกันข้ามไม่เป็นความจริง เนื่องจาก DST และ subtleties อื่น ๆ เขตเวลาหลายแห่งสามารถมีการชดเชยเดียวกันในบางวันของปีเท่านั้น
Romain G

1
- มีวิธีการแก้ปัญหาพื้นเมืองสำหรับตอนนี้เป็นสนามบินนานาชาติ API ในขณะที่ moment.js เป็นห้องสมุดที่ยอดเยี่ยมในสมัยนั้นมีทางเลือกน้อยกว่าในปัจจุบัน ( dayjs , date-fns ) ช่วงเวลาที่มีขนาดใหญ่มาก ; โปรดอย่าแนะนำสำหรับแอปพลิเคชันไคลเอนต์
Dan Dascalescu

43

ฉันเขียนฟังก์ชั่นในโครงการซึ่งส่งคืนเขตเวลาในhh:mmรูปแบบ ฉันหวังว่านี่อาจช่วยบางคน:

function getTimeZone() {
    var offset = new Date().getTimezoneOffset(), o = Math.abs(offset);
    return (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);
}

// Outputs: +5:00

Fiddle ทำงาน


1
ขอบคุณ! นี่คือสิ่งที่ฉันต้องการ!
Jeremy Moritz

15

หนึ่งซับที่ให้ทั้งออฟเซ็ตและเขตเวลาคือการเรียกtoTimeString ()บนวัตถุ Date ใหม่ จาก MDN:

toTimeString()วิธีการส่งกลับส่วนเวลาของวัตถุวันที่ในรูปแบบการอ่านของมนุษย์ในภาษาอังกฤษแบบอเมริกัน

สิ่งที่จับได้คือเขตเวลาไม่ได้อยู่ในรูปแบบ IANA มาตรฐาน มันค่อนข้างใช้งานง่ายกว่ารูปแบบIANA "ทวีป / เมือง" ลองดูสิ:

console.log(new Date().toTimeString().slice(9));
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
console.log(new Date().getTimezoneOffset() / -60);

ในแคลิฟอร์เนียตอนนี้toTimeString()ผลตอบแทนในขณะที่ผลตอบแทนที่สนามบินนานาชาติPacific Daylight Time API America/Los_Angelesในโคลอมเบียคุณต้องการได้รับเทียบกับColombia Standard TimeAmerica/Bogota

โปรดทราบว่าคำตอบอื่น ๆ ของคำถามนี้พยายามรับข้อมูลเดียวกันโดยการเรียก Date.toString () วิธีการนั้นไม่น่าเชื่อถืออย่างที่MDN อธิบาย :

อินสแตนซ์วันที่อ้างถึงจุดที่ระบุในเวลา Calling toString () จะคืนวันที่ในรูปแบบที่มนุษย์อ่านได้ในภาษาอังกฤษแบบอเมริกัน [... ] บางครั้งมันเป็นที่พึงปรารถนาที่จะได้รับสตริงส่วนเวลา; สิ่งนี้สามารถทำได้โดยใช้toTimeString()วิธีการ

toTimeString()วิธีการเป็นประโยชน์อย่างยิ่งเนื่องจากเครื่องมือที่สอดคล้องกับการดำเนินการ ECMA-262 อาจแตกต่างกันในสายที่ได้รับจากtoString()สำหรับDateวัตถุที่เป็นรูปแบบคือการดำเนินการขึ้นอยู่กับ; วิธีการแบ่งสตริงแบบธรรมดาอาจไม่ให้ผลลัพธ์ที่สอดคล้องกันในหลาย ๆ เอ็นจิ้น


13

ลองgetTimezoneOffset()ของDateวัตถุ:

var curdate = new Date()
var offset = curdate.getTimezoneOffset()

วิธีนี้จะคืนค่าเขตเวลาชดเชยในหน่วยนาทีซึ่งเป็นความแตกต่างระหว่าง GMT และเวลาท้องถิ่นเป็นนาที



7

ด้วยmoment.js :

moment().format('zz');

6
zและzzเลิกใช้แล้วตั้งแต่ 1.6.0 ดูmomentjs.com/docs/#/displaying/format
MrUpsidown

3
@MrUpsidown ตอนนี้ZและZZ
brauliobo

4
@brauliobo พารามิเตอร์เหล่านี้กลับไม่เหมือนเดิม z และ zz ส่งคืนเขตเวลาเช่น CST แต่ Z และ ZZ ส่งคืนค่าออฟเซ็ตเช่น -0600
Luca Spiller

ล่าสุดเอกสารแสดง.zoneAbbr()ได้เข้ามาแทนที่และz zzดูเอกสารที่นี่
tabish89

1
ในขณะที่ moment.js เป็นห้องสมุดที่ยอดเยี่ยมในสมัยนั้นมีทางเลือกน้อยกว่าในปัจจุบัน ( dayjs , date-fns ) ช่วงเวลาที่มีขนาดใหญ่มาก ; โปรดอย่าแนะนำสำหรับแอปพลิเคชันไคลเอนต์
Dan Dascalescu

6

กับ คุณสามารถค้นหาเขตเวลาปัจจุบันเป็น

console.log(moment().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>


กับ คุณสามารถค้นหาเขตเวลาปัจจุบันเป็น

console.log(dayjs().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://unpkg.com/dayjs@1.8.10/dayjs.min.js"></script>

API ทั้งสองคืนค่า utc เป็นนาที


ในขณะที่ moment.js เป็นห้องสมุดที่ยอดเยี่ยมในสมัยนั้นมีทางเลือกน้อยกว่าในปัจจุบัน ( dayjs , date-fns ) ช่วงเวลาที่มีขนาดใหญ่มาก ; โปรดอย่าแนะนำสำหรับแอปพลิเคชันไคลเอนต์
Dan Dascalescu

1
"ด้วย dayjs คุณสามารถหาเขตเวลาปัจจุบันเป็น" ไม่ถูกต้องว่า - คุณจะได้รับคำชดเชยไม่เขตเวลา นอกจากนี้Dayjs ไม่ได้สนับสนุนเขตเวลา มัน.utcOffset () วิธีการgetTimezoneOffset()เป็นเสื้อคลุมที่เรียบง่ายมากกว่าพื้นเมือง
Dan Dascalescu

4

เขตเวลาในชั่วโมง -

var offset = new Date().getTimezoneOffset();
if(offset<0)
    console.log( "Your timezone is- GMT+" + (offset/-60));
else
    console.log( "Your timezone is- GMT-" + offset/60);

หากคุณต้องการแม่นยำตามที่ระบุไว้ในความคิดเห็นคุณควรลองแบบนี้ -

var offset = new Date().getTimezoneOffset();

if(offset<0)
{
    var extraZero = "";
    if(-offset%60<10)
      extraZero="0";

    console.log( "Your timezone is- GMT+" + Math.ceil(offset/-60)+":"+extraZero+(-offset%60));
}
else
{
    var extraZero = "";
    if(offset%60<10)
      extraZero="0";

    console.log( "Your timezone is- GMT-" + Math.floor(offset/60)+":"+extraZero+(offset%60));
}


ไม่ทำงานสำหรับเขตเวลาเมื่อไม่ใช่ชั่วโมงเต็มเช่นเวเนซุเอลาซึ่งส่งคืน GMT-4.5
Mirko

ใช่ถูกต้องแล้ว 0.5 หมายถึง 0.5 * 30 นาที ฉันคิดว่าคุณได้รับสิ่งนี้ทำไมมันถึงให้ 0.5?
Abrar Jahin

ใช่ดังนั้น GMT-4.5 ไม่ใช่เขตเวลาที่ถูกต้องต้องมีการแยกวิเคราะห์พิเศษเพื่อให้เป็น GMT-4: 30
Mirko

@Mirko ส่วนที่สองของคำตอบสำหรับคุณคือ
Abrar Jahin

หากคุณต้องการแม่นยำยิ่งขึ้นให้ใช้ UTC แทน GMT, [Hilton and McCarthy 2013, p. 231-2 ] ดูได้ที่ wikipedia GMT - ( en.wikipedia.org/wiki/Greenwich_Mean_Time )
Tom Kuschel

3

หากสิ่งที่คุณต้องการคือตัวย่อเขตเวลา "MST" หรือ "EST":

function getTimeZone(){
    var now = new Date().toString();
    var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
    return timeZone;
}

การใช้Date.toString()ไม่น่าเชื่อถือและ MDN อธิบายว่าทำไม ฉันวางส่วนที่เกี่ยวข้องจากเอกสารของพวกเขาในคำตอบของฉัน
Dan Dascalescu

3

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

ป้อนคำอธิบายรูปภาพที่นี่

ดูเอกสาร MDN

var a = new Date().getTimezoneOffset();

var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;

console.log(res)


1
ในกรณีที่มูลค่าติดลบมีปัญหาบางประการ
อรุณประสาทสาด ES

1
ทำไมround? มันควรจะfloorเป็นใช่มั้ย
Qwertiy

3
function getLocalTimeZone() {
    var dd = new Date();
    var ddStr = dd.toString();
    var ddArr = ddStr.split(' ');
    var tmznSTr = ddArr[5];
    tmznSTr = tmznSTr.substring(3, tmznSTr.length);
    return tmznSTr;
}

ตัวอย่าง: พฤ. 21 มิ.ย. 2018 18:12:50 GMT + 0530 (เวลามาตรฐานอินเดีย)

O / P: +0530


การใช้Date.toString()ไม่น่าเชื่อถือและ MDN อธิบายว่าทำไม ฉันวางส่วนที่เกี่ยวข้องจากเอกสารของพวกเขาในคำตอบของฉัน
Dan Dascalescu


2

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

ตัวอย่างเช่นฉันมาจากไต้หวันและส่งคืน "+8" ให้ฉัน

ตัวอย่างการทำงาน

JS

function timezone() {
    var offset = new Date().getTimezoneOffset();
    var minutes = Math.abs(offset);
    var hours = Math.floor(minutes / 60);
    var prefix = offset < 0 ? "+" : "-";
    return prefix+hours;
}


$('#result').html(timezone());

HTML

<div id="result"></div>

ผลลัพธ์

+8

2

ในnew Date() คุณสามารถได้รับออฟเซ็ตเพื่อรับชื่อเขตเวลาที่คุณสามารถทำได้:

new Date().toString().replace(/(.*\((.*)\).*)/, '$2');

คุณได้ค่าระหว่าง()วันที่สิ้นสุดนั่นคือชื่อของเขตเวลา


การใช้Date.toString()ไม่น่าเชื่อถือและ MDN อธิบายว่าทำไม ฉันวางส่วนที่เกี่ยวข้องจากเอกสารของพวกเขาในคำตอบของฉัน นอกจากนี้คำตอบนี้ได้รับอย่างน้อย 3 ครั้งแล้ว
Dan Dascalescu

2

นี่จะเป็นทางออกของฉัน:


    // For time zone:
    const timeZone = /\((.*)\)/.exec(new Date().toString())[1];
    
    // Offset hours:
    const offsetHours = new Date().getTimezoneOffset() / 60;
    
    console.log(`${timeZone}, ${offsetHours}hrs`);

1

เป็นทางเลือกให้กับnew Date().getTimezoneOffset()และmoment().format('zz')คุณยังสามารถใช้:

var offset = moment.parseZone(Date.now()).utcOffset() / 60
console.log(offset);
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>

jstimezone เป็นรถบั๊กกี้และไม่มีการเคลื่อนไหว ( https://bitbucket.org/pellepim/jstimezonedetect/issues?status=new&status=open )


ในขณะที่ moment.js เป็นห้องสมุดที่ยอดเยี่ยมในสมัยนั้นมีทางเลือกน้อยกว่าในปัจจุบัน ( dayjs , date-fns ) ช่วงเวลาที่มีขนาดใหญ่มาก ; โปรดอย่าแนะนำสำหรับแอปพลิเคชันไคลเอนต์
Dan Dascalescu

1

ใช้สิ่งนี้เพื่อแปลง OffSet เป็น postive:

var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);

-2

ฉันกำลังมองหาสตริงตัวอักษร 3 ตัว (เช่น "PDT") และลองคำตอบของ Marquez แต่ต้องบิดมันเล็กน้อยเพื่อรองรับเบราว์เซอร์ข้าม โชคดีที่สตริงเป็นการจับคู่ที่เป็นไปได้สุดท้าย :)

นี่คือสิ่งที่ฉันทำใน CoffeeScript:

browserTimezone = ->
  userDate = new Date()
  zoneMatches = userDate.toString().match(/([A-Z][A-Z][A-Z])/g)
  userZone = zoneMatches[zoneMatches.length - 1]

ใช้งานได้ใน IE8, IE9, Safari 9, Firefox 44 และ Chrome 48


2
มีเขตเวลาที่มีตัวอักษร 4 ตัว - โปรดระวัง: CEST เช่น (เวลาฤดูร้อนกลางยุโรป)
jbrosi

การใช้Date.toString()ไม่น่าเชื่อถือและ MDN อธิบายว่าทำไม ฉันวางส่วนที่เกี่ยวข้องจากเอกสารของพวกเขาในคำตอบของฉัน
Dan Dascalescu

-3

คุณเพียงแค่ใส่ moment.js และ jstz.js

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.6/jstz.min.js"></script>

และหลังจากนั้น

<script>
$(function(){
 var currentTimezone = jstz.determine();
 var timezone = currentTimezone.name();
 alert(timezone);
});

</script>


-4

คุณสามารถลองสิ่งนี้ มันจะคืนคุณเวลาเครื่องปัจจุบัน

var _d = new Date(), t = 0, d = new Date(t*1000 + _d.getTime())


นี่เป็นวิธีที่ควรทำฉันคิดว่า: new Date(new Date().getTime()); มันจะแสดง: "ศุกร์ 28 ธ.ค. 2018 10:15:23 GMT + 0100 (เวลามาตรฐานยุโรปกลาง) {}"
darmis

-4

สิ่งนี้จะทำงาน


var time = new Date(),
timestamp = Date(1000 + time.getTime());
console.log(timestamp);

Thu May 25 2017 21:35:14 GMT+0300 (IDT)

ไม่ได้กำหนด

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