ฉันรู้ว่ามันช้าไปหน่อย แต่นี่คือวิธีแก้ปัญหาที่ฉันต้องหามาเพื่อจัดการวันที่เมื่อคุณต้องการเป็นเขตเวลาที่เป็นอิสระ โดยพื้นฐานแล้วมันเกี่ยวข้องกับการแปลงทุกอย่างเป็น UTC
จาก Javascript ไปยังเซิร์ฟเวอร์ :
ส่งวันที่เป็นค่ายุคโดยลบเขตเวลาออก
var d = new Date(2015,0,1)
$.ajax({
url: '/target',
params: { date: d.getTime() - (d.getTimezoneOffset() * 60 * 1000) }
});
จากนั้นเซิร์ฟเวอร์จะได้รับ 1420070400000 เป็นวันที่
ทางฝั่งเซิร์ฟเวอร์ให้แปลงค่ายุคนั้นเป็นอ็อบเจ็กต์วันที่และเวลา:
DateTime d = new DateTime(1970, 1, 1, 0, 0, 0).AddMilliseconds(epoch);
ณ จุดนี้วันที่เป็นเพียงวันที่ / เวลาที่ผู้ใช้ระบุตามที่ระบุไว้ เป็น UTC อย่างมีประสิทธิภาพ
ไปทางอื่น :
เมื่อเซิร์ฟเวอร์ดึงข้อมูลจากฐานข้อมูลซึ่งสันนิษฐานว่าเป็น UTC จะได้รับความแตกต่างเป็นยุค (ตรวจสอบให้แน่ใจว่าวัตถุวันที่ทั้งสองเป็นแบบโลคัลหรือ UTC):
long ms = (long)utcDate.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
หรือ
long ms = (long)localDate.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Local)).TotalMilliseconds;
เมื่อ javascript ได้รับค่านี้ให้สร้างออบเจ็กต์วันที่ใหม่ อย่างไรก็ตามวัตถุวันที่นี้จะถือว่าเป็นเวลาท้องถิ่นดังนั้นคุณต้องชดเชยด้วยเขตเวลาปัจจุบัน:
var epochValue = 1420070400000
var utcDateVal = new Date(epochValue);
var actualDate = new Date(utcDateVal.getTime() + (utcDateVal.getTimezoneOffset() * 60 * 1000))
console.log(utcDateVal);
console.log(actualDate);
เท่าที่ฉันรู้สิ่งนี้ควรใช้กับเขตเวลาใดก็ได้ที่คุณต้องแสดงวันที่ที่ไม่ขึ้นกับเขตเวลา