ฉันจะรวบรวมข้อมูลเขตเวลาของผู้เยี่ยมชมได้อย่างไร ฉันต้องการเขตเวลารวมถึงเวลาชดเชยเวลา GMT
ฉันจะรวบรวมข้อมูลเขตเวลาของผู้เยี่ยมชมได้อย่างไร ฉันต้องการเขตเวลารวมถึงเวลาชดเชยเวลา GMT
คำตอบ:
var offset = new Date().getTimezoneOffset();
console.log(offset);ออฟเซ็ตเขตเวลาคือความแตกต่างเป็นนาทีระหว่าง UTC กับเวลาท้องถิ่น โปรดทราบว่านี่หมายความว่าการชดเชยเป็นค่าบวกหากเขตเวลาท้องถิ่นอยู่หลัง UTC และลบหากอยู่ข้างหน้า ตัวอย่างเช่นหากเขตเวลาของคุณคือ UTC + 10 (เวลามาตรฐานทางตะวันออกของออสเตรเลีย), -600 จะถูกส่งกลับ เวลาออมแสงตามฤดูกาลป้องกันค่านี้จากการเป็นค่าคงที่แม้สำหรับสถานที่ที่กำหนด
โปรดทราบว่าเขตเวลาทั้งหมดไม่ได้รับการชดเชยตามชั่วโมงทั้งหมด: ตัวอย่างเช่นนิวฟันด์แลนด์เป็น UTC ลบ 3h 30m (ปล่อยให้ปรับเวลาตามฤดูกาลออกจากสมการ)
getTimezoneOffsetความไม่ถูกต้องมีผลหรือไม่ บทความที่คุณอ้างถึงคือวันที่เดือนมิถุนายน 2007 และไม่มีรายละเอียดของวิธีการที่ฟังก์ชั่นไม่ถูกต้อง และในความเป็นจริงแล้วห้องสมุดที่jsTimezoneDetectคุณชี้ใช้getTimezoneOffsetนั้น
                    var hrs = -(new Date().getTimezoneOffset() / 60) เพื่อชดเชยเวลาปกติที่ใช้
                    timezone! =utc offset
                    การใช้การชดเชยเพื่อคำนวณเขตเวลาเป็นวิธีการที่ไม่ถูกต้องและคุณจะพบปัญหาเสมอ เขตเวลาและกฎการปรับเวลาตามฤดูกาลอาจมีการเปลี่ยนแปลงหลายครั้งในระหว่างปีและเป็นการยากที่จะติดตามการเปลี่ยนแปลง
ในการรับเขตเวลาของIANAของระบบใน JavaScript คุณควรใช้
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)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คุณสมบัติไม่ได้กำหนดในกรณีนี้
ฉันรู้ว่าคำตอบนี้เป็นหัวข้อที่ค่อนข้างเล็กน้อย แต่ฉันคิดว่าพวกเราหลายคนกำลังมองหาคำตอบที่ต้องการจัดรูปแบบเขตเวลาสำหรับการแสดงผลและอาจได้รับตัวย่อของโซนด้วย ดังนั้นที่นี่มันจะไป ...
หากคุณต้องการให้เขตเวลาของไคลเอ็นต์อยู่ในรูปแบบที่ดีคุณสามารถใช้วิธีการ 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
split[4] + " " + split[5]!
                    splitมี: ["Mon", "Mar", "13", "2017", "14:05:22", "GMT-0400", "(Eastern", "Daylight", "Time)"]ดังนั้นผลลัพธ์คือDaylight Time)
                    new Date().toString()ขึ้นอยู่กับการตั้งค่าตำแหน่งที่ตั้งของคุณอย่างสมบูรณ์ การคาดหวังผลลัพธ์ของลูกค้ารายอื่นเพื่อให้ดูเหมือนคุณเป็นความคิดที่แย่มาก
                    ได้รับคำตอบแล้วว่าจะได้รับค่าชดเชยเป็นจำนวนเต็มในไม่กี่นาที แต่ในกรณีที่ทุกคนต้องการออฟเซ็ต 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))pad(parseInt(Math.abs(offset/60)), 2)เพื่อให้ถูกต้อง ... มิฉะนั้นคุณอาจได้รับ +5.530 เหมือนในกรณีของฉัน ... ฉันไม่แน่ใจว่าคณิตศาสตร์พื้น ฯลฯ จะเป็นสิ่งที่ดีกว่าที่นี่หรือไม่ .... แต่นี่ atleast ให้ฉัน +0530 ตามที่คาดไว้
                    คุณสามารถใช้ได้:
<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ฉันเขียนฟังก์ชั่นในโครงการซึ่งส่งคืนเขตเวลาใน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หนึ่งซับที่ให้ทั้งออฟเซ็ตและเขตเวลาคือการเรียก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วัตถุที่เป็นรูปแบบคือการดำเนินการขึ้นอยู่กับ; วิธีการแบ่งสตริงแบบธรรมดาอาจไม่ให้ผลลัพธ์ที่สอดคล้องกันในหลาย ๆ เอ็นจิ้น
ลองgetTimezoneOffset()ของDateวัตถุ:
var curdate = new Date()
var offset = curdate.getTimezoneOffset()วิธีนี้จะคืนค่าเขตเวลาชดเชยในหน่วยนาทีซึ่งเป็นความแตกต่างระหว่าง GMT และเวลาท้องถิ่นเป็นนาที
JavaScript:
var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);ด้วยmoment.js :
moment().format('zz');ZและZZ
                    กับ momentjsคุณสามารถค้นหาเขตเวลาปัจจุบันเป็น
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>กับ dayjsคุณสามารถค้นหาเขตเวลาปัจจุบันเป็น
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 เป็นนาที
getTimezoneOffset()เป็นเสื้อคลุมที่เรียบง่ายมากกว่าพื้นเมือง
                    เขตเวลาในชั่วโมง -
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));
}หากสิ่งที่คุณต้องการคือตัวย่อเขตเวลา "MST" หรือ "EST":
function getTimeZone(){
    var now = new Date().toString();
    var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
    return timeZone;
}Date.toString()ไม่น่าเชื่อถือและ MDN อธิบายว่าทำไม ฉันวางส่วนที่เกี่ยวข้องจากเอกสารของพวกเขาในคำตอบของฉัน 
                    ดูผลลัพธ์ตัวดำเนินการนี้อยู่ตรงข้ามกับเขตเวลาดังนั้นใช้ฟังก์ชันทางคณิตศาสตร์บางอย่างจากนั้นตรวจสอบความถูกต้องของจำนวนน้อยกว่าหรือมากกว่า
var a = new Date().getTimezoneOffset();
var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;
console.log(res)round? มันควรจะfloorเป็นใช่มั้ย
                    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 อธิบายว่าทำไม ฉันวางส่วนที่เกี่ยวข้องจากเอกสารของพวกเขาในคำตอบของฉัน 
                    ลองนี้
new Date().toString().split("GMT")[1].split(" (")[0]ค่านี้มาจากเครื่องของผู้ใช้และสามารถเปลี่ยนแปลงได้ตลอดเวลาดังนั้นฉันคิดว่ามันไม่สำคัญฉันแค่ต้องการรับค่าประมาณจากนั้นแปลงเป็น 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ในnew Date() คุณสามารถได้รับออฟเซ็ตเพื่อรับชื่อเขตเวลาที่คุณสามารถทำได้:
new Date().toString().replace(/(.*\((.*)\).*)/, '$2');
คุณได้ค่าระหว่าง()วันที่สิ้นสุดนั่นคือชื่อของเขตเวลา
Date.toString()ไม่น่าเชื่อถือและ MDN อธิบายว่าทำไม ฉันวางส่วนที่เกี่ยวข้องจากเอกสารของพวกเขาในคำตอบของฉัน นอกจากนี้คำตอบนี้ได้รับอย่างน้อย 3 ครั้งแล้ว
                    นี่จะเป็นทางออกของฉัน:
    // For time zone:
    const timeZone = /\((.*)\)/.exec(new Date().toString())[1];
    
    // Offset hours:
    const offsetHours = new Date().getTimezoneOffset() / 60;
    
    console.log(`${timeZone}, ${offsetHours}hrs`);
เป็นทางเลือกให้กับnew Date().getTimezoneOffset()และmoment().format('zz')คุณยังสามารถใช้momentjs:
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 )
ใช้สิ่งนี้เพื่อแปลง OffSet เป็น postive:
var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);ฉันกำลังมองหาสตริงตัวอักษร 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
Date.toString()ไม่น่าเชื่อถือและ MDN อธิบายว่าทำไม ฉันวางส่วนที่เกี่ยวข้องจากเอกสารของพวกเขาในคำตอบของฉัน 
                    คุณเพียงแค่ใส่ 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>นี่เป็นงานที่ดีมากสำหรับฉัน:
// Translation to offset in Unix Timestamp
let timeZoneOffset = ((new Date().getTimezoneOffset())/60)*3600;คุณสามารถลองสิ่งนี้ มันจะคืนคุณเวลาเครื่องปัจจุบัน
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 (เวลามาตรฐานยุโรปกลาง) {}"
                    สิ่งนี้จะทำงาน
var time = new Date(),
timestamp = Date(1000 + time.getTime());
console.log(timestamp);Thu May 25 2017 21:35:14 GMT+0300 (IDT)ไม่ได้กำหนด