ฉันจะรวบรวมข้อมูลเขตเวลาของผู้เยี่ยมชมได้อย่างไร ฉันต้องการเขตเวลารวมถึงเวลาชดเชยเวลา 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 Time
America/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)
ไม่ได้กำหนด