ฉันต้องการให้เซิร์ฟเวอร์ให้บริการวันที่เสมอใน UTC ใน HTML และให้ JavaScript บนเว็บไซต์ลูกค้าแปลงเป็นเขตเวลาท้องถิ่นของผู้ใช้
โบนัสถ้าฉันสามารถส่งออกในรูปแบบวันที่สถานที่ของผู้ใช้
ฉันต้องการให้เซิร์ฟเวอร์ให้บริการวันที่เสมอใน UTC ใน HTML และให้ JavaScript บนเว็บไซต์ลูกค้าแปลงเป็นเขตเวลาท้องถิ่นของผู้ใช้
โบนัสถ้าฉันสามารถส่งออกในรูปแบบวันที่สถานที่ของผู้ใช้
คำตอบ:
ดูเหมือนว่าวิธีที่จะเข้าใจผิดได้มากที่สุดในการเริ่มต้นด้วยวันที่ UTC คือการสร้างDate
วัตถุใหม่และใช้setUTC…
วิธีการตั้งค่าเป็นวันที่ / เวลาที่คุณต้องการ
จากนั้นtoLocale…String
วิธีการต่างๆจะให้ผลลัพธ์ที่แปลเป็นภาษาท้องถิ่น
// This would come from the server.
// Also, this whole block could probably be made into an mktime function.
// All very bare here for quick grasping.
d = new Date();
d.setUTCFullYear(2004);
d.setUTCMonth(1);
d.setUTCDate(29);
d.setUTCHours(2);
d.setUTCMinutes(45);
d.setUTCSeconds(26);
console.log(d); // -> Sat Feb 28 2004 23:45:26 GMT-0300 (BRT)
console.log(d.toLocaleString()); // -> Sat Feb 28 23:45:26 2004
console.log(d.toLocaleDateString()); // -> 02/28/2004
console.log(d.toLocaleTimeString()); // -> 23:45:26
var d = new Date(Date.UTC(2004,1,29,2,45,26));
toLocaleString()
ฟังก์ชั่น
คำถามนี้ค่อนข้างเก่าสักครู่ดังนั้นจึงไม่มีอยู่ในขณะนั้น แต่สำหรับโครงการใหม่มันทำให้งานแบบนี้ง่ายขึ้นมาก
วิธีที่ดีที่สุดคือการแยกสตริงวันที่ของคุณจาก UTC ดังนี้ (สร้างสตริงที่เข้ากันได้กับISO-8601บนเซิร์ฟเวอร์เพื่อให้ได้ผลลัพธ์ที่สอดคล้องกันในทุกเบราว์เซอร์):
var m = moment("2013-02-08T09:30:26Z");
ตอนนี้ใช้m
ในแอปพลิเคชันของคุณสักครู่ค่าเริ่มต้นของโซนเวลาท้องถิ่นสำหรับการดำเนินการแสดงผล มีหลายวิธีในการจัดรูปแบบค่าวันที่และเวลาหรือแยกส่วนของมัน
คุณสามารถจัดรูปแบบวัตถุช่วงเวลาในสถานที่ของผู้ใช้เช่นนี้:
m.format('LLL') // Returns "February 8 2013 8:30 AM" on en-us
ที่จะเปลี่ยนวัตถุ moment.js เป็นเขตเวลาที่แตกต่างกัน (เช่นค่าหนึ่งในท้องถิ่นหรือ UTC), คุณจะต้องขยายเขต moment.js หน้านั้นยังมีตัวอย่างบางส่วนมันใช้งานง่ายมาก
For old projects, just use jQuery
คุณสามารถใช้new Date().getTimezoneOffset()/60
สำหรับเขตเวลา นอกจากนี้ยังมีtoLocaleString()
วิธีการแสดงวันที่โดยใช้ภาษาของผู้ใช้
นี่คือรายการทั้งหมด: การทำงานกับวันที่
toLocaleString
อะไร
เมื่อคุณสร้างวัตถุวันที่ของคุณแล้วนี่เป็นตัวอย่างข้อมูลสำหรับการแปลง:
ฟังก์ชั่นใช้วัตถุวันที่จัดรูปแบบ UTC และสตริงรูปแบบ
คุณจะต้องมีDate.strftime
ต้นแบบ
function UTCToLocalTimeString(d, format) {
if (timeOffsetInHours == null) {
timeOffsetInHours = (new Date().getTimezoneOffset()/60) * (-1);
}
d.setHours(d.getHours() + timeOffsetInHours);
return d.strftime(format);
}
getTimezoneOffset()/60
อาจส่งกลับเศษส่วน (เช่นอินเดียชดเชย +05: 30 จะส่งคืน 5.5) ทศนิยมถูกปัดเศษ มิฉะนั้นการตั้งค่าเวลาจะอัปเดตค่าอื่น ๆ (ตั้งค่าชั่วโมงเป็น 48 และดูว่าเกิดอะไรขึ้น)
ใน JS ไม่มีวิธีที่ง่ายและข้ามแพลตฟอร์มในการจัดรูปแบบวันที่เวลาท้องถิ่นนอกเหนือจากการแปลงสถานที่ให้บริการแต่ละรายการดังกล่าวข้างต้น
นี่คือแฮ็คด่วนที่ฉันใช้รับ YYYY-MM-DD ในพื้นที่ โปรดทราบว่านี่เป็นแฮ็คเนื่องจากวันสุดท้ายจะไม่มีเขตเวลาที่ถูกต้องอีกต่อไป (ดังนั้นคุณต้องข้ามเขตเวลา) หากฉันต้องการสิ่งอื่นเพิ่มเติมฉันใช้ moment.js
var d = new Date();
d = new Date(d.getTime() - d.getTimezoneOffset() * 60000)
var yyyymmdd = t.toISOString().slice(0,0);
// 2017-05-09T08:24:26.581Z (but this is not UTC)
d.getTimezoneOffset () คืนค่าเขตเวลาชดเชยในหน่วยนาทีและ d.getTime () เป็น ms ดังนั้น x 60,000
นี่คือสิ่งที่ฉันใช้ในโครงการที่ผ่านมา:
var myDate = new Date();
var tzo = (myDate.getTimezoneOffset()/60)*(-1);
//get server date value here, the parseInvariant is from MS Ajax, you would need to do something similar on your own
myDate = new Date.parseInvariant('<%=DataCurrentDate%>', 'yyyyMMdd hh:mm:ss');
myDate.setHours(myDate.getHours() + tzo);
//here you would have to get a handle to your span / div to set. again, I'm using MS Ajax's $get
var dateSpn = $get('dataDate');
dateSpn.innerHTML = myDate.localeFormat('F');
getTimezoneOffset()/60
มักจะส่งกลับค่าทศนิยม นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งสำหรับวันที่ก่อนปี 1900 ที่หลายแห่งมีการชดเชยในนาทีและวินาที นอกจากนี้จำเป็นต้องใช้วันที่จาวาสคริปต์เพื่อสนับสนุนการหักล้างประวัติ เช่นในปี 1890 การชดเชยในมอสโกคือ +2: 30: 17 ดูเบราว์เซอร์, โซนเวลา Chrome 67 ข้อผิดพลาด
.getTimezoneOffset()
วิธีการรายงานเขตเวลาชดเชยในนาทีนับ "ตะวันตก" จากเขตเวลา GMT / UTC ส่งผลให้ค่าชดเชยที่เป็นลบกับสิ่งที่หนึ่งจะคุ้นเคยกันทั่วไป (ตัวอย่าง, เวลานิวยอร์กจะถูกรายงานให้เป็น +240 นาทีหรือ +4 ชั่วโมง)
ในการรับการชดเชยเวลาปกติในหน่วยชั่วโมงคุณต้องใช้:
var timeOffsetInHours = -(new Date()).getTimezoneOffset()/60
รายละเอียดที่สำคัญ:
โปรดทราบว่าการปรับเวลาตามฤดูกาลเป็นปัจจัยสำคัญในผลลัพธ์ - ดังนั้นวิธีการนี้ให้เวลาชดเชยกับคุณจริงๆ- ไม่ใช่การชดเชยเวลาทางภูมิศาสตร์ตามโซนเวลาจริง
ด้วยวันที่จากรหัส PHP ฉันใช้สิ่งนี้ ..
function getLocalDate(php_date) {
var dt = new Date(php_date);
var minutes = dt.getTimezoneOffset();
dt = new Date(dt.getTime() + minutes*60000);
return dt;
}
เราเรียกมันได้เช่นนี้
var localdateObj = getLocalDate('2015-09-25T02:57:46');
ฉันผสมคำตอบจนถึงตอนนี้และเพิ่มเข้าไปเพราะฉันต้องอ่านคำตอบทั้งหมดและตรวจสอบเพิ่มเติมในขณะนี้เพื่อแสดงสตริงวันที่จาก db ในรูปแบบเขตเวลาท้องถิ่นของผู้ใช้
สตริง datetime มาจาก python / django db ในรูปแบบ: 2016-12-05T15: 12: 24.215Z
การตรวจสอบความน่าเชื่อถือของภาษาเบราว์เซอร์ใน JavaScript ดูเหมือนจะไม่ทำงานในทุกเบราว์เซอร์ (ดูJavaScript สำหรับตรวจจับการตั้งค่าภาษาเบราว์เซอร์ ) ดังนั้นฉันจึงได้รับภาษาเบราว์เซอร์จากเซิร์ฟเวอร์
Python / Django: ส่งภาษาเบราว์เซอร์คำขอเป็นพารามิเตอร์บริบท:
language = request.META.get('HTTP_ACCEPT_LANGUAGE')
return render(request, 'cssexy/index.html', { "language": language })
HTML: เขียนในอินพุตที่ซ่อนอยู่:
<input type="hidden" id="browserlanguage" value={{ language }}/>
JavaScript: รับค่าอินพุตที่ซ่อนอยู่เช่น en-GB, en-US; q = 0.8, en; q = 0.6 / จากนั้นใช้ภาษาแรกในรายการเท่านั้นผ่านการแทนที่และการแสดงออกปกติ
const browserlanguage = document.getElementById("browserlanguage").value;
var defaultlang = browserlanguage.replace(/(\w{2}\-\w{2}),.*/, "$1");
JavaScript: แปลงเป็น datetime และจัดรูปแบบ:
var options = { hour: "2-digit", minute: "2-digit" };
var dt = (new Date(str)).toLocaleDateString(defaultlang, options);
ผลลัพธ์คือ (ภาษาเบราว์เซอร์คือ en-gb): 05/12/2016, 14:58
// new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]])
var serverDate = new Date(2018, 5, 30, 19, 13, 15); // just any date that comes from server
var serverDateStr = serverDate.toLocaleString("en-US", {
year: 'numeric',
month: 'numeric',
day: 'numeric',
hour: 'numeric',
minute: 'numeric',
second: 'numeric'
})
var userDate = new Date(serverDateStr + " UTC");
var locale = window.navigator.userLanguage || window.navigator.language;
var clientDateStr = userDate.toLocaleString(locale, {
year: 'numeric',
month: 'numeric',
day: 'numeric'
});
var clientDateTimeStr = userDate.toLocaleString(locale, {
year: 'numeric',
month: 'numeric',
day: 'numeric',
hour: 'numeric',
minute: 'numeric',
second: 'numeric'
});
console.log("Server UTC date: " + serverDateStr);
console.log("User's local date: " + clientDateStr);
console.log("User's local date&time: " + clientDateTimeStr);
options
ส่วนสำหรับกรณีของฉัน)
ทางออกที่ดีที่สุดที่ฉันเจอคือการสร้าง [time display = "llll" datetime = "UTC TIME" /] แท็กและใช้ javascript (jquery) เพื่อแยกวิเคราะห์และแสดงสัมพันธ์กับเวลาของผู้ใช้
http://momentjs.com/ Moment.js
จะแสดงเวลาอย่างสวยงาม
คุณสามารถใช้สิ่งต่อไปนี้ซึ่งรายงานเขตเวลาชดเชยจาก GMT ในไม่กี่นาที:
new Date().getTimezoneOffset();
หมายเหตุ: - ฟังก์ชั่นนี้คืนค่าจำนวนลบ
ในการแปลงวันที่เป็นวันที่ท้องถิ่นให้ใช้วิธี toLocaleDateString ()
var date = (new Date(str)).toLocaleDateString(defaultlang, options);
ในการแปลงเวลาเป็นเวลาท้องถิ่นให้ใช้เมธอด toLocaleTimeString ()
var time = (new Date(str)).toLocaleTimeString(defaultlang, options);
ไม่ทราบวิธีการทำสถานที่ แต่จาวาสคริปต์เป็นเทคโนโลยีฝั่งไคลเอ็นต์
usersLocalTime = new Date();
จะมีเวลาและวันที่ของลูกค้าในนั้น (ตามที่รายงานโดยเบราว์เซอร์ของพวกเขาและโดยการขยายคอมพิวเตอร์ที่พวกเขานั่งอยู่) มันควรจะเป็นเรื่องเล็กน้อยที่จะรวมเวลาของเซิร์ฟเวอร์ในการตอบสนองและทำคณิตศาสตร์ง่าย ๆ เพื่อชดเชยการคาดเดา
toLocateDateString()
ส่งคืนบางสิ่งที่ดูเหมือน 'วันอาทิตย์ 12 มกราคม 2014' ..