แปลงวันที่เป็น UTC โดยใช้ moment.js


95

คำตอบที่เป็นไปได้และง่ายสำหรับสิ่งนี้ แต่ฉันไม่สามารถหาวิธีรับ moment.js เพื่อส่งคืนเวลาวันที่ UTC เป็นมิลลิวินาทีได้ นี่คือสิ่งที่ฉันกำลังทำ:

var date = $("#txt-date").val(),
    expires = moment.utc(date);

มีความคิดว่าฉันทำอะไรผิดหรือเปล่า?

คำตอบ:


101

นี้จะพบในเอกสาร เมื่อใช้ไลบรารีสักครู่ฉันขอให้คุณอ่านเอกสารทั้งหมด มันสำคัญมากจริงๆ

สมมติว่ามีการป้อนข้อความตามเวลาท้องถิ่นของผู้ใช้:

 var expires = moment(date).valueOf();

หากผู้ใช้ได้รับคำแนะนำให้ป้อนวันที่ / เวลา UTC จริงแล้ว:

 var expires = moment.utc(date).valueOf();

22
แก้ไข - ลบ "อย่างง่ายดาย". :)
Matt Johnson-Pint

6
และถ้าฉันมีช่วงเวลาวันที่และเขตเวลาอยู่แล้วฉันจะแปลงเป็น UTC ได้อย่างไร
アレックス

@Alexander -.utc()
Matt Johnson-Pint

2
ไม่ได้ผล ซึ่งจะเปลี่ยนเฉพาะวิธีการที่ใช้ในวันที่เท่านั้นไม่ใช่วันที่
Colleen

2
@ Colleen - ใช่ แต่โดยปกติแล้วเราจะเรียกหนึ่งในวิธีการเหล่านั้นเช่น.format()ซึ่งจะปล่อยค่า UTC มันไม่สามารถเปลี่ยนค่าวันภายในตัวเองเพราะDateมีอยู่แล้วติดตามการประทับเวลา UTC เป็นเพียงวิธีการที่เรียกใช้ซึ่งกำหนดว่าจะปล่อยเวลา UTC หรือเวลาท้องถิ่น โมเมนต์ก็เหมือนกันในเรื่องนั้น
Matt Johnson-Pint

53

ฉันใช้วิธีนี้แล้วได้ผล ValueOf ไม่ได้ผลสำหรับฉัน

moment.utc(yourDate).format()

2
ใช้งานได้ตามเอกสารประกอบ แปลงเวลาท้องถิ่นเป็น UTC
Kishor Pawar

1
มีบางอย่างที่คาวอยู่ที่นี่ ฉันใช้ moment.js ver. 2.17.1 และถ้า 'yourdate' เป็น '2017-10-14T21: 00: 00Z' (en-us) ตัวอย่างข้างต้นจะส่งคืนผลลัพธ์เดียวกัน '2017-10-14T21: 00: 00Z' ซึ่งเห็นได้ชัดว่าไม่ใช่ utc เนื่องจากฉันอยู่ใน gmt + 3 ผลลัพธ์ที่ถูกต้องคือ '2017-10-15T00: 00: 00 + 03: 00' และคุณจะได้รับผ่าน 'moment (yourDate) .format ()'
XDS

14

ณ วันที่: moment.js version 2.24.0

สมมติว่าคุณมีอินพุตวันที่ในท้องถิ่นนี่เป็นวิธีที่เหมาะสมในการแปลงอินพุต dateTimeหรือTimeเป็นUTC :

var utcStart = new moment("09:00", "HH:mm").utc();

หรือในกรณีที่คุณระบุวันที่

var utcStart = new moment("2019-06-24T09:00", "YYYY-MM-DDTHH:mm").utc();

ดังที่คุณเห็นผลลัพธ์ผลลัพธ์จะถูกส่งกลับใน UTC:

//You can call the format() that will return your UTC date in a string 
 utcStart.format(); 
//Result : 2019-06-24T13:00:00 

แต่ถ้าคุณทำตามด้านล่างนี้จะไม่แปลงเป็น UTC:

var myTime = new moment.utc("09:00", "HH:mm"); 

คุณตั้งค่าอินพุตของคุณเป็นเวลา utc เท่านั้นราวกับว่าคุณกำลังพูดถึงว่า myTime อยู่ใน UTC .... ผลลัพธ์จะเป็น 9:00


3
moment.utc(date).format(...); 

เป็นวิธีที่จะไปตั้งแต่

moment().utc(date).format(...);

ทำตัวแปลก ๆ ...


1
คุณช่วยอธิบายพฤติกรรมแปลก ๆ ของmoment().utc(date).format(...)?
Freeman Lambda

2
พฤติกรรมไม่แปลก แต่เป็นวิธีการที่แตกต่างกัน ประการแรกmoment.utc(date)คือการแยกวิเคราะห์ไฟล์date. ประการที่สองmoment().utc(date)คือการจัดการเวลาปัจจุบัน ( moment()) และdateพารามิเตอร์ไม่มีประโยชน์เนื่องจาก.utc()ในกรณีนี้ไม่ได้คาดหวังพารามิเตอร์ใด ๆ
CodingHamster

2

สิ่งนี้ได้ผลสำหรับฉัน คนอื่นอาจเห็นว่ามีประโยชน์

// date = 2020-08-31T00: 00: 00Z ฉันอยู่ในเดนมาร์ก (เขตเวลาคือ +2 ชั่วโมง)

moment.utc (ช่วงเวลา (วันที่) .utc ()). format () // ส่งคืน 2020-08-30T22: 00: 00Z


1

หากทุกอย่างล้มเหลวให้เริ่มต้นใหม่ด้วยการผกผันออฟเซ็ตภายใน

var timestamp = new Date();
var inverseOffset = moment(timestamp).utcOffset() * -1;
timestamp = moment().utcOffset( inverseOffset  );

timestamp.toISOString(); // This should give you the accurate UTC equivalent.

วิธีนี้ใช้ไม่ได้ สิ่งที่ไม่ทำงานคือการตั้งค่าkeepOffsetพารามิเตอร์ที่แท้จริงในขณะที่moment(timestamp).toISOString(true),
คริสเฮนส์

1

ที่นี่ฉันกำลังส่งออบเจ็กต์วันที่และแปลงเป็นเวลา UTC

$.fn.convertTimeToUTC = function (convertTime) {
   if($(this).isObject(convertTime)) {
        return moment.tz(convertTime.format("Y-MM-DD HH:mm:ss"), moment.tz.guess()).utc().format("Y-MM-DD HH:mm:ss");
    }
};
// Returns if a value is an object
$.fn.isObject =  function(value) {
    return value && typeof value === 'object';
};


//you can call it as below
$(this).convertTimeToUTC(date);

1

นี่คือคำตอบ:

moment.utc(moment(localdate)).format()
localdate = '2020-01-01 12:00:00'

moment(localdate)
//Moment<2020-01-01T12:00:00+08:00>

moment.utc(moment(localdate)).format()
//2020-01-01T04:00:00Z

0

อ่านเอกสารของ moment.js นี้ที่นี่ ดูตัวอย่างด้านล่างและผลลัพธ์ที่ฉันแปลงเวลา GMT เป็นเวลาท้องถิ่น (โซนของฉันคือ IST) จากนั้นฉันจะแปลงเวลาท้องถิ่นเป็น GMT

// convert GMT to local time
console.log('Server time:' + data[i].locationServerTime)
let serv_utc = moment.utc(data[i].locationServerTime, "YYYY-MM-DD HH:mm:ss").toDate();
console.log('serv_utc:' + serv_utc)
data[i].locationServerTime = moment(serv_utc,"YYYY-MM-DD HH:mm:ss").tz(self.zone_name).format("YYYY-MM-DD HH:mm:ss");
console.log('Converted to local time:' + data[i].locationServerTime)

// convert local time to GMT
console.log('local time:' + data[i].locationServerTime)
let serv_utc = moment(data[i].locationServerTime, "YYYY-MM-DD HH:mm:ss").toDate();
console.log('serv_utc:' + serv_utc)
data[i].locationServerTime = moment.utc(serv_utc,"YYYY-MM-DD HH:mm:ss").format("YYYY-MM-DD HH:mm:ss");
console.log('Converted to server time:' + data[i].locationServerTime)

เอาต์พุตคือ

Server time:2019-12-19 09:28:13
serv_utc:Thu Dec 19 2019 14:58:13 GMT+0530 (India Standard Time)
Converted to local time:2019-12-19 14:58:13
local time:2019-12-19 14:58:13
serv_utc:Thu Dec 19 2019 14:58:13 GMT+0530 (India Standard Time)
Converted to server time:2019-12-19 09:28:13

-1

คุณไม่จำเป็นต้องมีอะไรมาเปรียบเทียบแล้วดึงมิลลิวินาทีหรือ

ตัวอย่างเช่น:

let enteredDate = $("#txt-date").val(); // get the date entered in the input
let expires = moment.utc(enteredDate); // convert it into UTC

ด้วยการที่คุณมีวันหมดอายุใน UTC ตอนนี้คุณสามารถรับวันที่ "ตอนนี้" ใน UTC และเปรียบเทียบ:

var rightNowUTC = moment.utc(); // get this moment in UTC based on browser
let duration = moment.duration(rightNowUTC.diff(expires)); // get the diff
let remainingTimeInMls = duration.asMilliseconds();

moment.valueOf()และ(new Date()).getTime()ผลตอบแทนทั้งมิลลิวินาทีตั้งแต่ 1 มกราคม 1970 เวลา UTC (เป็นมาตรฐาน)
Drenai
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.