แปลงวันที่เป็นเขตเวลาอื่นใน JavaScript


336

ฉันกำลังมองหาฟังก์ชั่นที่จะแปลงวันที่ในเขตเวลาหนึ่งไปยังเขตเวลาอื่น

มันต้องการสองพารามิเตอร์

  • วันที่ (ในรูปแบบ "2012/04/10 10:10:30 +0000")
  • สตริงเขตเวลา ("เอเชีย / จาการ์ตา")

สตริงเขตเวลาอธิบายไว้ในhttp://en.wikipedia.org/wiki/Zone.tab

มีวิธีง่าย ๆ ในการทำเช่นนี้?


1
ค้นหาออฟเซ็ต UTC ของเมืองที่ระบุ stackoverflow.com/questions/3002910/…
Brandon Boone

3
ฉันต้องการที่จะคำนวณไม่เพียง แต่ชดเชย UTC แต่ยังเวลาออมแสง / ฤดูร้อน ดังนั้นเวลาจะกลับมาอย่างถูกต้อง
Rizky Ramadhan


ตรวจสอบอันนี้stackoverflow.com/questions/16084313/…
Amol M Kulkarni

ปิดการตั้งค่าเขตเวลาของคุณโดยใช้คำสั่ง unix date: date +% s -d '1 Jan 1970'
anthony

คำตอบ:


191

var aestTime = new Date().toLocaleString("en-US", {timeZone: "Australia/Brisbane"});
console.log('AEST time: '+ (new Date(aestTime)).toISOString())

var asiaTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Shanghai"});
console.log('Asia time: '+ (new Date(asiaTime)).toISOString())

var usaTime = new Date().toLocaleString("en-US", {timeZone: "America/New_York"});
console.log('USA time: '+ (new Date(usaTime)).toISOString())

var indiaTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Kolkata"});
console.log('India time: '+ (new Date(indiaTime)).toISOString())

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString


1
ฉันเปลี่ยนคำตอบเนื่องจากนี่เป็นวิธีที่ถูกต้องและเป็นมาตรฐานโดยไม่ต้องใช้ไลบรารีใด ๆ
Rizky Ramadhan

5
เอกสารประกอบของ MDN ระบุอย่างชัดเจนว่าเขตเวลาเดียวที่จำเป็นต้องได้รับการยอมรับในการใช้งานทั้งหมดคือ UTC ( stackoverflow.com/questions/10087819/… ) การคลิกปุ่ม [เรียกใช้ข้อมูลโค้ด] ใน IE11 สร้างข้อผิดพลาด
แม่น้ำวิเวียน

1
หากใครที่กำลังมองหาการใช้งานที่เหมาะกับเบราว์เซอร์ทั้งหมดในตอนนี้พวกเขาสามารถลองตอบคำถามด้านล่างโดยใช้ข้อเสียของมันเอง ...
Rizky Ramadhan

14
คำตอบนี้แสดงการผ่านเขตเวลาอย่างถูกต้องtoLocaleStringแต่จากนั้นจะแสดงการส่งผ่านสตริงนั้นกลับเข้าไปในตัวDateสร้างอย่างไม่ถูกต้อง นั่นคือการขอปัญหา ตัวแยกวิเคราะห์สตริงวันที่ไม่จำเป็นต้องยอมรับรูปแบบเฉพาะของสถานที่และอินพุตจะได้รับการปฏิบัติเสมือนว่าอยู่ในเขตเวลาท้องถิ่น อย่าทำอย่างนั้น เพียงแค่ใช้สายออกจากการtoLocalStringโทรครั้งแรก
Matt Johnson-Pint

4
@MattJohnson คุณไม่สามารถใช้ getHour () หรือวิธีการอื่น ๆ ได้
Ali Padida

131

สำหรับmoment.jsผู้ใช้งานขณะนี้คุณสามารถใช้ช่วงเวลา-เขตเวลา เมื่อใช้งานฟังก์ชันของคุณจะมีลักษณะดังนี้:

function toTimeZone(time, zone) {
    var format = 'YYYY/MM/DD HH:mm:ss ZZ';
    return moment(time, format).tz(zone).format(format);
}

3
ฉันไม่แน่ใจว่าจะเพิ่มเขตเวลาใหม่อย่างไรเอกสารไม่ได้ช่วยฉัน ฉันเป็นโปรแกรมเมอร์ไม่ใช่ผู้เชี่ยวชาญเวลา!
Parziphal

8
ปัญหาที่นี่คือสิ่งนี้ไม่ได้ส่งกลับวัตถุวันที่ใหม่ก็จะส่งกลับสตริง ถ้านั่นคือสิ่งที่คุณต้องการนั่นก็ดีแน่นอน
nickdnk

2
ไม่ใช่ "ย้อนกลับช่วงเวลา (เวลา) .tz (โซน) .format (รูปแบบ);" ? ข้อผิดพลาดที่คุณให้ในรหัสของคุณมีข้อผิดพลาด "วันที่ไม่ถูกต้อง"
Tarek

1
ไม่สามารถโหลด Moment.js ในเบราว์เซอร์ได้ เศร้ามาก :(
Daniil Shevelev

4
หากคุณไม่ได้มีความสุขเกี่ยวกับการส่ง 180K เบราว์เซอร์ที่มีสำเนาของฐานข้อมูล TZ และสามารถอยู่กับการย่อยสลายเป็นเขตเวลาปัจจุบันบนเบราว์เซอร์รุ่นเก่าลอง @ คำตอบ lambinator Date.prototype.toLocaleStringโดยใช้
Peter V. Mørch

92

ถูกขโมยอย่างไร้ยางอายจาก: http://www.techrepublic.com/article/convert-the-local-time-to-another-time-zone-with-this-javascript/6016329

/** 
 * function to calculate local time
 * in a different city
 * given the city's UTC offset
 */
function calcTime(city, offset) {

    // create Date object for current location
    var d = new Date();

    // convert to msec
    // add local time zone offset
    // get UTC time in msec
    var utc = d.getTime() + (d.getTimezoneOffset() * 60000);

    // create new Date object for different city
    // using supplied offset
    var nd = new Date(utc + (3600000*offset));

    // return time as a string
    return "The local time in " + city + " is " + nd.toLocaleString();
}

ฟังก์ชันนี้มีประโยชน์ในการคำนวณค่าเขตเวลาโดยระบุชื่อเมือง / ประเทศและค่าออฟเซ็ต


4
ดี .... แต่ฉันคิดว่าเขาต้องการให้ออฟเซ็ตค้นหาเขาตามการผ่านในเมือง
Brandon Boone

117
สิ่งนี้ไม่ได้คำนึงถึงการเปลี่ยนแปลงการออมในเวลากลางวัน
Robotbugs

12
ไม่ตอบคำถาม แต่ตอบคำถามของฉัน (+1)
Reign.85

นั่นคือ '3600000' ฆ่าฉัน! ในอินพุต tz ควรได้รับในไม่กี่ชั่วโมง! และควรลบออก ดังนั้นถ้าคุณผ่าน: var d = ใหม่วันที่ calcTime ('', d.getTimezoneOffset () / 60); มันควรจะคืนให้ในเวลาเดียวกัน
Praveen

1
คำตอบนี้ล้าสมัยอย่างจริงจังและควรถูกลบออกโดยเฉพาะอย่างยิ่งชิ้นส่วนที่ใช้toLocaleStringซึ่งจะรายงานโซนเวลาของโฮสต์เมื่อมีการเปลี่ยนไปใช้เขตเวลาอื่น มีวิธีที่ดีกว่ามากในการสร้างการประทับเวลาด้วยตนเองสำหรับออฟเซ็ตต่าง ๆ
RobG

89

เบราว์เซอร์บนเดสก์ท็อปส่วนใหญ่ (ไม่ใช่อุปกรณ์เคลื่อนที่) ยกเว้น Safari รองรับฟังก์ชั่นtoLocaleStringพร้อมอาร์กิวเมนต์เบราว์เซอร์รุ่นเก่ามักจะไม่สนใจอาร์กิวเมนต์

new Date().toLocaleString('en-US', { timeZone: 'Asia/Jakarta' })

4
ล้มเหลวใน Firefox และ Edge :(
Šime Vidas

10
เนื่องจากสิ่งนี้ล้มเหลวอย่างหนักใน FF และ IE11 + จึงต้องหาวิธีแก้ไขปัญหาอื่น
jdavid.net

2
ขอบโครเมี่ยมและชอบมัน :)
Suhail Mumtaz Awan

6
ใช้งานได้กับ Chrome v59 และ Firefox desktop v54 และ Chome บน Android v59 และ Safari 10 บน iOS 10.3 มันไม่ทำงานบน IE10 คำอธิบายของ MDN เกี่ยวกับ Date.prototype.toLocaleString ()มีการtoLocaleStringSupportsLocales()ติดตั้งที่ช่วยให้คุณสามารถตรวจสอบการสนับสนุนได้อย่างน่าเชื่อถือ
Peter V. Mørch

1
ทดสอบสำเร็จใน node.js v8.7.0
Heinrich Ulbricht

56

โอเคพบแล้ว!

ฉันใช้เขตเวลา-js นี่คือรหัส:

var dt = new timezoneJS.Date("2012/04/10 10:10:30 +0000", 'Europe/London');
dt.setTimezone("Asia/Jakarta");

console.debug(dt); //return formatted date-time in asia/jakarta

90
ฉันต้องลงคะแนนให้กับเรื่องนี้ time-js ไม่สนับสนุน DST และไม่ได้โฆษณาว่าใน readme ของมันซึ่งทำให้เป็นเคล็ดลับที่ไม่ดีสำหรับผู้ที่กำลังมองหาสิ่งนี้ ดู: github.com/mde/timezone-js/issues/51และปัญหาอื่น ๆ อีกจำนวนมากที่ได้รับการยื่นและดูเหมือนจะไม่ได้รับการแก้ไข

@ ไม่มีใช่ แต่จริงๆแล้วไม่มีวิธีแก้ปัญหาสำหรับการจัดการเขตเวลา / วันที่ฝั่งไคลเอ็นต์ ... jquery ui datepicker ทำให้ฉันคลั่งไคล้เพราะเรื่องนี้ ไชโย
ลูคัส

2
@Marabunta ดูเหมือนว่าช่วงเวลา (ตอบโดย Brian Di Palma) สนับสนุน DST github.com/moment/moment-timezone/issues/21
welldan97

2
อย่าใช้ TimezoneJS เพราะมีการเปลี่ยนแปลง DST
matf

17

หากคุณไม่ต้องการนำเข้าห้องสมุดขนาดใหญ่คุณสามารถใช้Intl.DateTimeFormatเพื่อแปลงออบเจกต์ Date เป็นเขตเวลาที่แตกต่างกัน

// Specifying timeZone is what causes the conversion, the rest is just formatting
const options = {
  year: '2-digit', month: '2-digit', day: '2-digit',
  hour: '2-digit', minute: '2-digit', second: '2-digit',
  timeZone: 'Asia/Jakarta',
  timeZoneName: 'short'
}
const formater = new Intl.DateTimeFormat('sv-SE', options)
const startingDate = new Date("2012/04/10 10:10:30 +0000")

const dateInNewTimezone = formater.format(startingDate) 
console.log(dateInNewTimezone) // 12-04-10 17:10:30 GMT+7

ออฟเซ็ตการปรับเวลาตามฤดูกาลและการเปลี่ยนแปลงในอดีตจะได้รับการดูแลสำหรับคุณ


IE10 + ไม่รองรับ Intl API สำหรับเขตเวลา moment.github.io/luxon/docs/manual/matrix.html
Chloe

นี่เป็นคำตอบที่ดีที่สุด toLocaleStringมีการใช้งานที่ไม่สอดคล้องกันและทำงานได้ตั้งแต่ IE11 เป็นต้นไป
dlsso

FYI: สิ่งนี้ใช้ไม่ได้ใน IE11 อย่างน้อยใน Windows 8.1 เมื่อคุณพยายามสร้างformatterวัตถุคุณจะได้รับ: `` `ค่าตัวเลือก 'เอเชีย / จาการ์ตา' สำหรับ 'เขตเวลา' อยู่นอกช่วงที่ถูกต้อง คาดว่า: ['UTC'] `` `
veddermatic

มีวิธีแปลงผลลัพธ์สุดท้ายจากตัวจัดรูปแบบเป็นวัตถุวันที่อีกครั้งหรือไม่
mding5692

10

เข้าใจแล้ว!

ต้องการบังคับให้แสดงวันที่ = วันที่เซิร์ฟเวอร์ไม่มีการตั้งค่าท้องถิ่น (UTC)

เซิร์ฟเวอร์ของฉันคือ GMT-6 -> new Date (). getTimezoneOffset () = 360

myTZO = 360;
myNewDate=new Date(myOldDateObj.getTime() + (60000*(myOldDateObj.getTimezoneOffset()-myTZO)));
alert(myNewDate);

2
แม้ว่ามันจะแสดงเวลาไร้เดียงสาที่ถูกต้อง แต่ข้อมูลเขตเวลาจาก myOldDateObj จะถูกเก็บไว้ ดังนั้นจริงๆแล้วมันเป็นเวลาที่ผิด (เมื่อคุณใช้เวลาเป็นตัวอย่างในเวลาและไม่ใช่เวลาในนาฬิกา)
gabn88

@ gabn88: คุณจะไม่สามารถเปลี่ยนเวลาเซิร์ฟเวอร์โดยใช้ Javascript ... หากต้องการแก้ไขเวลาเซิร์ฟเวอร์ให้ทำในระดับระบบปฏิบัติการ
Cedric Simon

2
ฉันไม่จำเป็นต้องแก้ไขเวลาเซิร์ฟเวอร์) เวลาเซิร์ฟเวอร์เป็นเวลา UTC สำหรับฉันเสมอ แต่ฉันมีองค์กรที่แตกต่างกันในเขตเวลาที่แตกต่างกัน และอุปกรณ์ของพวกเขาควรแสดงเวลาที่องค์กรของพวกเขาประจำการอยู่เสมอไม่ว่าพวกเขาจะอยู่ที่ไหน
gabn88

เรามีปัญหาที่คล้ายคลึงกันในการแสดงวันที่เสมอโซนเวลา X เราพยายามที่จะส่งวันที่ทั้งหมดในรูปแบบสตริงจากเซิร์ฟเวอร์และในเบราว์เซอร์เราก็ถือว่าพวกเขาเป็นวันที่เขตเวลาท้องถิ่น
Venkateswara Rao

5

คุณสามารถใช้วิธี toLocaleString () สำหรับการตั้งค่าเขตเวลา

new Date().toLocaleString('en-US', { timeZone: 'Indian/Christmas' })

สำหรับอินเดียคุณสามารถใช้ "อินเดีย / คริสต์มาส" และต่อไปนี้เป็นเขตเวลาต่างๆ

"Antarctica/Davis",
    "Asia/Bangkok",
    "Asia/Hovd",
    "Asia/Jakarta",
    "Asia/Phnom_Penh",
    "Asia/Pontianak",
    "Asia/Saigon",
    "Asia/Vientiane",
    "Etc/GMT-7",
    "Indian/Christmas"

คุณไม่ได้ตั้งค่าเขตเวลา แต่ให้สร้างสตริงด้วยเวลาที่แสดงในโซนเวลานั้น วันที่ยังคงเหมือนเดิม
เจอราร์ดโอนีล

toLocaleStringแก้ปัญหาที่ถูกรับแล้ว 4 ปีที่แล้ว
Dan Dascalescu

4

หากคุณเพียงแค่ต้องแปลงเขตเวลาที่ฉันได้อัปโหลดรุ่นปล้นลงของช่วงเวลา-เขตมีเพียง functionallity ขั้นต่ำเปลือย ข้อมูล ~ 1KB +:

S.loadData({
    "zones": [
        "Europe/Paris|CET CEST|-10 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|11e6",
        "Australia/Sydney|AEDT AEST|-b0 -a0|01010101010101010101010|1GQg0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|40e5",
    ],
    "links": [
        "Europe/Paris|Europe/Madrid",
    ]
});

let d = new Date();
console.log(S.tz(d, "Europe/Madrid").toLocaleString());
console.log(S.tz(d, "Australia/Sydney").toLocaleString());

2

ตั้งค่าตัวแปรที่มีปีเดือนและวันคั่นด้วยสัญลักษณ์ '-' รวมถึง 'T' และเวลาในรูปแบบ HH: mm: ss ตามด้วย +01: 00 ที่ส่วนท้ายของสตริง (ในกรณีของฉันคือ เขตเวลาคือ +1) จากนั้นใช้สตริงนี้เป็นอาร์กิวเมนต์สำหรับตัวสร้างวันที่

//desired format: 2001-02-04T08:16:32+01:00
dateAndTime = year+"-"+month+"-"+day+"T"+hour+":"+minutes+":00+01:00";

var date = new Date(dateAndTime );

2

ฉันควรทราบว่าฉันถูก จำกัด ด้วยความเคารพต่อห้องสมุดภายนอกที่ฉันสามารถใช้ได้ moment.js และ timezone-js ไม่ใช่ตัวเลือกสำหรับฉัน

วัตถุวันที่ js ที่ฉันมีอยู่ใน UTC ฉันต้องได้รับวันที่และเวลาจากวันที่นี้ในเขตเวลาที่เฉพาะเจาะจง ('อเมริกา / ชิคาโก' ในกรณีของฉัน)

 var currentUtcTime = new Date(); // This is in UTC

 // Converts the UTC time to a locale specific format, including adjusting for timezone.
 var currentDateTimeCentralTimeZone = new Date(currentUtcTime.toLocaleString('en-US', { timeZone: 'America/Chicago' }));

 console.log('currentUtcTime: ' + currentUtcTime.toLocaleDateString());
 console.log('currentUtcTime Hour: ' + currentUtcTime.getHours());
 console.log('currentUtcTime Minute: ' + currentUtcTime.getMinutes());
 console.log('currentDateTimeCentralTimeZone: ' +        currentDateTimeCentralTimeZone.toLocaleDateString());
 console.log('currentDateTimeCentralTimeZone Hour: ' + currentDateTimeCentralTimeZone.getHours());
 console.log('currentDateTimeCentralTimeZone Minute: ' + currentDateTimeCentralTimeZone.getMinutes());

UTC ปัจจุบันใช้เวลาประมาณ 6 ชั่วโมงก่อนหน้า 'อเมริกา / ชิคาโก' ผลลัพธ์คือ:

currentUtcTime: 11/25/2016
currentUtcTime Hour: 16
currentUtcTime Minute: 15

currentDateTimeCentralTimeZone: 11/25/2016
currentDateTimeCentralTimeZone Hour: 10
currentDateTimeCentralTimeZone Minute: 15

11
new Date();ส่งคืนเขตเวลาท้องถิ่นไม่ใช่ UTC
Mirko

1
จากเอกสาร:If no arguments are provided, the constructor creates a JavaScript Date object for the current date and time according to system settings.
Mirko

อืมมม ค่อนข้างสับสน สิ่งนี้จะไม่เปลี่ยนเขตเวลาในวันที่ ค่อนข้างจะสร้างวันใหม่ด้วยชั่วโมงที่เปลี่ยนแปลง มันจะมากชัดเจนที่จะใช้การแสดงออกปกติเพื่อดึงค่าที่คุณต้องการจากสตริงที่สร้างขึ้นจากการเรียก toLocaleString
เจอราร์ด

2

นี่คือรหัสของฉันมันทำงานได้อย่างสมบูรณ์แบบคุณสามารถลองให้ตัวอย่างด้านล่าง:

$(document).ready(function() {
   //EST
setInterval( function() {
var estTime = new Date();
 var currentDateTimeCentralTimeZone = new Date(estTime.toLocaleString('en-US', { timeZone: 'America/Chicago' }));
var seconds = currentDateTimeCentralTimeZone.getSeconds();
var minutes = currentDateTimeCentralTimeZone.getMinutes();
var hours =  currentDateTimeCentralTimeZone.getHours()+1;//new Date().getHours();
 var am_pm = currentDateTimeCentralTimeZone.getHours() >= 12 ? "PM" : "AM";

if (hours < 10){
     hours = "0" + hours;
}

if (minutes < 10){
     minutes = "0" + minutes;
}
if (seconds < 10){
     seconds = "0" + seconds;
}
    var mid='PM';
    if(hours==0){ //At 00 hours we need to show 12 am
    hours=12;
    }
    else if(hours>12)
    {
    hours=hours%12;
    mid='AM';
    }
    var x3 = hours+':'+minutes+':'+seconds +' '+am_pm
// Add a leading zero to seconds value
$("#sec").html(x3);
},1000);


});
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<p class="date_time"><strong id="sec"></strong></p>
</body>
</html>


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

รหัสด้านบนที่ฉันได้รับคือการอัปเดตเขตเวลาของคุณเป็นเขตเวลาของประเทศอื่น
Sahil Kapoor

คุณต้องใส่ HTML ในไฟล์ html ของคุณและให้รหัส jQuery ข้างต้นต้องอยู่ในส่วนท้าย มันจะทำงานให้คุณตาม ('en-US', {timeZone: 'America / Chicago'}) คุณต้องอัปเดตค่าทั้งสองนี้หากคุณต้องการประเทศอื่น ๆ เขตเวลาขอบคุณ
Sahil Kapoor

ไม่รอ. ฉันเพิ่งโหวตขึ้นโดยไม่มองอย่างระมัดระวัง ทำไมคุณเพิ่ม 1 ถึงcurrentDateTimeCentralTimeZone.getHours()? หากไม่มีก็จะใช้งานได้และเป็นเช่นเดียวกับการหาคำตอบของstackoverflow.com/a/40809160/1404185
27

1

คุณสามารถลองทำเช่นนี้เพื่อแปลงเขตเวลาของวันที่เป็นอินเดีย:

var indianTimeZoneVal = new Date().toLocaleString('en-US', {timeZone: 'Asia/Kolkata'});
var indainDateObj = new Date(indianTimeZoneVal);
indainDateObj.setHours(indainDateObj.getHours() + 5);
indainDateObj.setMinutes(indainDateObj.getMinutes() + 30);
console.log(indainDateObj);

1
หลังจากขั้นตอนที่ 2 ตัวเองฉันได้รับเวลาในอินเดีย ... ดังนั้นทำไมคุณยังคงเพิ่ม 5 & 1/2 ชั่วโมง?
user3833732

เมื่อใช้วิธีการดังกล่าวฉันจะได้รับสิ่งต่อไปนี้ที่นอร์เวย์เมื่อฉันคอนโซลบันทึกด้วย Chrome: ดั้งเดิม: พ.ย. 27 2018 15:53:46 GMT + 0200 (sentraleuropeisk sommertid) ดัดแปลง: พฤหัสบดี 27 ก.ย. 2018 19:23:46 GMT + 0200 (sentraleuropeisk sommertid) “ sentraleuropeisk sommertid” หมายถึงเวลาฤดูร้อนยุโรปกลาง ไม่แน่ใจว่าจะทำงานเมื่อคุณต้องการเวลาฤดูร้อนสำหรับอินเดียหรือในทางกลับกันเมื่อคุณอยู่ในอินเดียและต้องการเวลาฤดูร้อนสำหรับยุโรปและอื่น ๆ
Kebman

การใช้ setHours () เช่นนี้ไม่ได้หมายถึงการเปลี่ยนวัน, เดือน, ปีตัวอย่างเช่น 3.30 น. ใน New Dell ในวันที่ 8 คือ 23.00 น. ของวันที่ 7 ในลอนดอน พิจารณาวันสิ้นเดือนปีและวันอธิกสุรทิน ให้ Date ทำคณิตศาสตร์นั้น <pre> ให้ local_time = new Date (zulu_time.getTime () + 3600000 * std_timezone.timezone_factor - 60 * 60 * 1,000); ให้ date_str = local_time.toISOString (). ชิ้น (0, 10); ให้ time_str = local_time.toISOString (). slice (11, -1); ให้ timezone_str = std_timezone.timezone_str; </pre>
Lincoln Randall McFarland

1

ต้องดูรอบ ๆ รวมถึงการเชื่อมโยงจากหน้านี้ฉันพบบทความที่ดีนี้ใช้เขตเวลา:

https://www.webniraj.com/2016/11/23/javascript-using-moment-js-to-display-dates-times-in-users-timezone/

ในการสรุป:

รับเขตเวลาของผู้ใช้

var tz = moment.tz.guess();
console.info('Timezone: ' + tz);

ส่งคืนเช่น: เขตเวลา: ยุโรป / ลอนดอน

ตั้งค่าเขตเวลาเริ่มต้นของผู้ใช้

moment.tz.setDefault(tz);

ตั้งค่าเขตเวลาที่กำหนดเอง

moment.tz.setDefault('America/Los_Angeles');

แปลงวันที่ / เวลาเป็นเขตเวลาท้องถิ่นสมมติว่าวันที่ / เวลาดั้งเดิมอยู่ใน UTC

moment.utc('2016-12-25 07:00').tz(tz).format('ddd, Do MMMM YYYY, h:mma');

ส่งคืน: อา. วันที่ 25 ธันวาคม 2559, 7:00 น

แปลงวันที่ / เวลาเป็น LA Time

moment.utc('2016-12-25 07:00').tz('America/Los_Angeles').format('ddd, Do MMMM YYYY, h:mma');

คืนค่า: วันเสาร์ที่ 24 ธันวาคม 2559 เวลา 23.00 น

แปลงจากเวลา LA ถึงลอนดอน

moment.tz('2016-12-25 07:00', 'America/Los_Angeles').tz('Europe/London').format( 'ddd, Do MMMM YYYY, h:mma' );

คืนค่า: วันอาทิตย์ที่ 25 ธันวาคม 2559 เวลา 15.00 น


1

นอกจากนี้คุณยังสามารถใช้ https://www.npmjs.com/package/ctoc_timezone

มีการปรับใช้และการปรับแต่งรูปแบบที่ง่ายมาก

การเปลี่ยนรูปแบบใน toTimeZone:

CtoC.toTimeZone(new Date(),"EST","Do MMM YYYY hh:mm:ss #{EST}");

ผลผลิต:

28th Feb 2013 19:00:00 EST

คุณสามารถสำรวจฟังก์ชันการทำงานหลายอย่างในเอกสาร


0

มีโมดูล npm ชื่อ 'timezones.json' ที่คุณสามารถใช้ได้ มันเป็นพื้นประกอบด้วยไฟล์ json กับวัตถุที่มีข้อมูลเกี่ยวกับการประหยัดเวลากลางวันและออฟเซ็ต, ....

สำหรับเอเชีย / จาการ์ตาจะสามารถส่งคืนวัตถุนี้ได้:

{
  "value": "SE Asia Standard Time",
  "abbr": "SAST",
  "offset": 7,
  "isdst": false,
  "text": "(UTC+07:00) Bangkok, Hanoi, Jakarta",
  "utc": [
    "Antarctica/Davis",
    "Asia/Bangkok",
    "Asia/Hovd",
    "Asia/Jakarta",
    "Asia/Phnom_Penh",
    "Asia/Pontianak",
    "Asia/Saigon",
    "Asia/Vientiane",
    "Etc/GMT-7",
    "Indian/Christmas"
  ]
}

คุณสามารถค้นหาได้ที่นี่:

https://github.com/dmfilipenko/timezones.json

https://www.npmjs.com/package/timezones.json

หวังว่ามันจะมีประโยชน์


0

คนที่คุ้นเคยกับjava.timeแพคเกจjava 8 หรือjoda-timeอาจจะรักเด็กคนใหม่ในบล็อก: ห้องสมุดjs-joda

ติดตั้ง

npm install js-joda js-joda-timezone --save

ตัวอย่าง

<script src="node_modules/js-joda/dist/js-joda.js"></script>
<script src="node_modules/js-joda-timezone/dist/js-joda-timezone.js"></script>
<script>
var dateStr = '2012/04/10 10:10:30 +0000';
JSJoda.use(JSJodaTimezone);
var j = JSJoda;
// https://js-joda.github.io/js-joda/esdoc/class/src/format/DateTimeFormatter.js~DateTimeFormatter.html#static-method-of-pattern
var zonedDateTime = j.ZonedDateTime.parse(dateStr, j.DateTimeFormatter.ofPattern('yyyy/MM/dd HH:mm:ss xx'));
var adjustedZonedDateTime = zonedDateTime.withZoneSameInstant(j.ZoneId.of('America/New_York'));
console.log(zonedDateTime.toString(), '=>', adjustedZonedDateTime.toString());
// 2012-04-10T10:10:30Z => 2012-04-10T06:10:30-04:00[America/New_York]
</script>

ในธรรมชาติของจาวาจริงมันเป็นคำพูดที่สวยมาก แต่การเป็นคลัง java ที่มีพอร์ตโดยเฉพาะอย่างยิ่งเมื่อพิจารณาว่าพวกเขาโอนย้ายกรณีทดสอบ 1800 รายการแล้วมันก็อาจทำงานได้อย่างยอดเยี่ยมอย่างแม่นยำ

การจัดการโครโนนั้นเป็นเรื่องยาก นั่นเป็นเหตุผลที่ห้องสมุดอื่น ๆ จำนวนมากมีปัญหาในกรณีที่ขอบ Moment.js ดูเหมือนจะทำให้เขตเวลาถูกต้อง แต่ js libs อื่น ๆ ที่ฉันเคยเห็นรวมถึงtimezone-jsดูเหมือนจะไม่น่าเชื่อถือ


0

ฉันเพิ่งทำสิ่งนี้ใน typescript:

// fromTimezone example : Europe/Paris, toTimezone example: Europe/London
private calcTime( fromTimezone: string, toTimezone: string, dateFromTimezone: Date ): Date {
  const dateToGetOffset = new Date( 2018, 5, 1, 12 );

  const fromTimeString = dateToGetOffset.toLocaleTimeString( "en-UK", { timeZone: fromTimezone, hour12: false } );
  const toTimeString = dateToGetOffset.toLocaleTimeString( "en-UK", { timeZone: toTimezone, hour12: false } );

  const fromTimeHours: number = parseInt( fromTimeString.substr( 0, 2 ), 10 );
  const toTimeHours: number = parseInt( toTimeString.substr( 0, 2 ), 10 );

  const offset: number = fromTimeHours - toTimeHours;

  // convert to msec
  // add local time zone offset
  // get UTC time in msec
  const dateFromTimezoneUTC = Date.UTC( dateFromTimezone.getUTCFullYear(),
    dateFromTimezone.getUTCMonth(),
    dateFromTimezone.getUTCDate(),
    dateFromTimezone.getUTCHours(),
    dateFromTimezone.getUTCMinutes(),
    dateFromTimezone.getUTCSeconds(),
  );

  // create new Date object for different city
  // using supplied offset
  const dateUTC = new Date( dateFromTimezoneUTC + ( 3600000 * offset ) );

  // return time as a string
  return dateUTC;
}

ฉันใช้รูปแบบ "en-UK" เพราะเป็นรูปแบบที่เรียบง่าย น่าจะเป็น "en-US" หรืออะไรก็ได้

ถ้าอาร์กิวเมนต์แรกคือเขตเวลาของสถานที่ของคุณและ seconde เป็นเขตเวลาเป้าหมายของคุณจะส่งคืนวัตถุวันที่ด้วยการชดเชยที่ถูกต้อง


0

ผมมีปัญหาในการใช้เขตเวลาสักครู่ ฉันกำลังเพิ่มคำตอบนี้ดังนั้นถ้ามีคนอื่นประสบปัญหาเดียวกัน ดังนั้นผมจึงมีสตริงวันที่มาจากฉัน2018-06-14 13:51:00 APIฉันรู้ว่านี่ถูกเก็บไว้ในUTCแต่สตริงไม่ได้พูดเพื่อตัวเอง

ฉันให้เขตเวลาสักครู่รู้ว่าเขตเวลาวันนี้มาจากการทำ:

let uTCDatetime = momentTz.tz("2018-06-14 13:51:00", "UTC").format();
// If your datetime is from any other timezone then add that instead of "UTC"
// this actually makes the date as : 2018-06-14T13:51:00Z

ตอนนี้ฉันต้องการแปลงเป็นเขตเวลาที่กำหนดโดยทำ:

let dateInMyTimeZone = momentTz.tz(uTCDatetime, "Asia/Kolkata").format("YYYY-MM-DD HH:mm:ss");
// now this results into: 2018-06-14 19:21:00, which is the corresponding date in my timezone.

0

เพียงแค่ตั้งค่าเขตเวลาของประเทศที่คุณต้องการและคุณสามารถแสดงเป็น html ได้อย่างง่ายดายโดยใช้ SetInteval () ฟังก์ชั่นทุก ๆ นาที ฟังก์ชั่น formatAMPM () จัดการรูปแบบ 12 ชั่วโมงและแสดงเวลา AM / PM

$(document).ready(function(){
        var pakTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Karachi"});
        pakTime = new Date(pakTime);

        var libyaTime = new Date().toLocaleString("en-US", {timeZone: "Africa/Tripoli"});
        libyaTime = new Date(libyaTime);



         document.getElementById("pak").innerHTML = "PAK  "+formatAMPM(pakTime);
         document.getElementById("ly").innerHTML = "LY   " +formatAMPM(libyaTime);

        setInterval(function(today) {
            var pakTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Karachi"});
            pakTime = new Date(pakTime);

            var libyaTime = new Date().toLocaleString("en-US", {timeZone: "Africa/Tripoli"});
            libyaTime = new Date(libyaTime);


           document.getElementById("pak").innerHTML = "PAK  "+formatAMPM(pakTime);
           document.getElementById("ly").innerHTML = "LY  " +formatAMPM(libyaTime);

        },10000);

         function formatAMPM(date) {
            var hours = date.getHours();
            var minutes = date.getMinutes();
            var ampm = hours >= 12 ? 'pm' : 'am';
            hours = hours % 12;
            hours = hours ? hours : 12; // the hour '0' should be '12'
            minutes = minutes < 10 ? '0'+minutes : minutes;
            var strTime = hours + ':' + minutes + ' ' + ampm;
            return strTime;
        }


    });

-1

ฉันไม่ทราบวิธีที่ง่ายในการแปลงวัตถุวันที่เป็นเขตเวลาใด ๆ แต่ถ้าคุณต้องการแปลงเป็นเขตเวลาท้องถิ่นคุณสามารถแปลงมันDate.prototype.getTime()เป็นจำนวนมิลลิวินาทีที่สอดคล้องกันและกลับมาอีกครั้ง

date = new Date('2016-05-24T13:07:20');
date = new Date(date.getTime());

ตัวอย่างเช่นdate.getHours()ตอนนี้จะกลับมา15แทน13ถ้าคุณเป็นเช่นฉันในออสเตรีย (และเป็นฤดูร้อน)

ฉันได้อ่านว่าฟังก์ชั่นวันที่และเวลาต่างๆอาจแสดงพฤติกรรมที่ไม่ได้มาตรฐานในบางเบราว์เซอร์ดังนั้นให้ทดสอบก่อน ฉันสามารถยืนยันได้ว่าทำงานได้ใน Chrome


1
ทำไมเรื่องนี้ถึงถูกโหวต? นี่เป็นวิธีที่ง่ายที่สุดและดีที่สุดในการทำสิ่งนี้ คำตอบส่วนใหญ่ไม่ได้คำนึงถึงเวลาฤดูร้อน / ฤดูหนาว
MortenSickel

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

-1

การชดเชยเวลาสำหรับเขตเวลาปัจจุบันของคุณ

date +%s -d '1 Jan 1970'

สำหรับเขตเวลา GMT + 10 ของฉัน (ออสเตรเลีย) จะส่งคืน -36,000


-6

เปลี่ยนชั่วโมงด้วยตนเองอย่างรวดเร็วและสกปรกและกลับมา:

return new Date(new Date().setHours(new Date().getHours()+3)).getHours()

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