ฉันรู้วิธีการชดเชยเขตเวลา แต่สิ่งที่ฉันต้องการคือความสามารถในการตรวจจับบางอย่างเช่น "อเมริกา / นิวยอร์ก" เป็นไปได้หรือไม่จาก JavaScript หรือเป็นสิ่งที่ฉันจะต้องทำให้เป็นแบบแขกรับเชิญตามออฟเซ็ต?
ฉันรู้วิธีการชดเชยเขตเวลา แต่สิ่งที่ฉันต้องการคือความสามารถในการตรวจจับบางอย่างเช่น "อเมริกา / นิวยอร์ก" เป็นไปได้หรือไม่จาก JavaScript หรือเป็นสิ่งที่ฉันจะต้องทำให้เป็นแบบแขกรับเชิญตามออฟเซ็ต?
คำตอบ:
สากล APIสนับสนุนได้รับเขตเวลาของผู้ใช้และได้รับการสนับสนุนในเบราว์เซอร์ในปัจจุบันทั้งหมด
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
โปรดทราบว่าในเบราว์เซอร์เวอร์ชันเก่าบางเวอร์ชันที่รองรับ Internationalization API timeZone
คุณสมบัตินี้จะถูกตั้งค่าundefined
เป็นสตริงเขตเวลาของผู้ใช้แทน ดีที่สุดเท่าที่ฉันสามารถบอกได้ในขณะที่เขียน (กรกฎาคม 2017) เบราว์เซอร์ปัจจุบันทั้งหมดยกเว้น IE11จะส่งคืนเขตเวลาของผู้ใช้เป็นสตริง
คำตอบที่ได้รับการโหวตมากที่สุดน่าจะเป็นวิธีที่ดีที่สุดในการรับเขตเวลาอย่างไรก็ตาม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...
โซลูชัน
คุณสามารถใช้สคริปต์นี้ http://pellepim.bitbucket.org/jstz/
ที่เก็บส้อมหรือโคลนที่นี่ https://bitbucket.org/pellepim/jstimezonedetect
เมื่อคุณรวมสคริปต์แล้วคุณจะได้รับรายชื่อเขตเวลาในjstz.olson.timezones
ตัวแปร-
และรหัสต่อไปนี้ใช้เพื่อกำหนดเขตเวลาของเบราว์เซอร์ไคลเอนต์
var tz = jstz.determine();
tz.name();
สนุกกับ jstz!
ดึงเขตเวลาตามชื่อ (เช่น "America / New York")
moment.tz.guess();
Intl.DateTimeFormat().resolvedOptions().timeZone
Intl.DateTimeFormat().resolvedOptions().timeZone
ให้กลับundefined
แต่moment.tz.guess()
ส่งคืนค่าที่ถูกต้อง
คุณสามารถเขียนโค้ดของคุณเองโดยใช้ตารางการทำแผนที่ที่นี่: http://www.timeanddate.com/time/zones/
หรือใช้ห้องสมุดเขตเวลาช่วงเวลา: http://momentjs.com/timezone/docs/
ดู zone.name; // America/Los_Angeles
หรือไลบรารีนี้: https://github.com/Canop/tzdetect.js
สิ่งนี้ได้รับรหัสเขตเวลา (เช่นGMT
) ในจาวาสคริปต์รุ่นเก่า (ฉันใช้สคริปต์แอป Google กับเอ็นจิ้นเก่า):
function getTimezoneName() {
return new Date().toString().get(/\((.+)\)/);
}
ฉันแค่วางไว้ตรงนี้เผื่อมีคนต้องการ
UTC
/ GMT
. ดูเหมือนคนอื่นจะสะกด เช่นPacific Daylight Time
.
ลองใช้รหัสนี้อ้างอิงจากที่นี่
<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>
ใน 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