Moment.js เปลี่ยนเป็นวัตถุวันที่


696

ใช้ Moment.js ฉันไม่สามารถแปลงวัตถุช่วงเวลาที่ถูกต้องเป็นวัตถุวันที่ด้วยเขตเวลา ฉันไม่สามารถรับวันที่ที่ถูกต้องได้

ตัวอย่าง:

var oldDate = new Date(),
    momentObj = moment(oldDate).tz("MST7MDT"),
    newDate = momentObj.toDate();
console.log("start date " + oldDate)
console.log("Format from moment with offset " + momentObj.format())
console.log("Format from moment without offset " + momentObj.utc().format())
console.log("(Date object) Time with offset " + newDate)
console.log("(Date object) Time without offset "+ moment.utc(newDate).toDate())

1
คุณคาดหวังผลลัพธ์แบบใดและคุณได้รับผลลัพธ์แบบใด
เฟลิกซ์คลิง

4
4 แถวให้ฉันเอาท์พุท: <code> (วันที่ของวัตถุ) เวลาที่มีการชดเชยพฤ. 01 ส.ค. 2013 15:23:49 GMT + 0300 (леинляндия (лето)) </code> แต่เขตเวลาต้องเป็น MST7MDT
vadim.zhiltsov

Wednesday 24th 2019, 12:47:48 amเป็นไปได้ที่จะแปลงเป็น2019-04-23T19:17:48.000Z ? @ vadim.zhiltsov
Anupam Maurya

วัตถุวันที่ไม่มีเขตเวลามันเป็นเพียงการชดเชยจาก 1970-01-01T00: 00: 00Z ดังนั้นเมื่อคุณโทรtodate.tz("MST7MDT")วัตถุกลับมีการสูญเสียข้อมูลเขตเวลาที่คุณติดอยู่กับวัตถุขณะที่มี นั่นเป็นเหตุผลที่ว่าทำไมไลบรารีเช่น moment.tz มีอยู่เพื่อเสริมความสามารถของกระดูกเปล่าของวัตถุ Date ที่มีอยู่ภายในซึ่งเข้าใจ UTC และเขตเวลาของโฮสต์เท่านั้น
RobG

คำตอบ:


1236

ใช้สิ่งนี้เพื่อแปลงวัตถุโมเมนต์เป็นวัตถุวันที่:

จากhttp://momentjs.com/docs/#/displaying/as-javascript-date/

moment().toDate();

อัตราผลตอบแทน:

Tue Nov 04 2014 14:04:01 GMT-0600 (CST)

11
@Spencer - ใช่มันตอบชื่อและtoDateเป็นที่แน่นอนว่าจะได้รับวัตถุจากDate momentแต่รหัสในเนื้อความของคำถามถามเกี่ยวกับการแปลงเขตเวลา - ซึ่งDateไม่สามารถทำได้ นอกเสียจากว่าเวลา Mountain เป็นเขตเวลาของผู้ใช้ฉันไม่แน่ใจว่าสิ่งนี้จะตอบคำถามได้อย่างไร
Matt Johnson-Pint

1
@ ระบุว่าขึ้นอยู่กับส่วนของคำถามที่คุณกำลังดูอยู่ คนส่วนใหญ่ค้นหา google และเห็นว่าชื่อนี้ตรงกับคำถามของพวกเขาและตอบคำถามที่ตอบคำตอบนั้นไม่ใช่เนื้อหาของคำถาม นั่นอาจอธิบายได้ว่าทำไมสิ่งนี้ถึงมี upvotes มากที่สุดถึงแม้ว่ามันจะไม่ได้ช่วย OP ในทางเทคนิค
สเปนเซอร์

14
นี่เป็นคำตอบที่ถูกต้องจริงหรือ คำถามคือวิธีการแปลงวัตถุช่วงเวลาเป็นวันที่จาวาสคริปต์ แต่ด้วย TIMEZONE มันยังคงเปลี่ยนกลับไปเป็นเขตเวลาท้องถิ่นเมื่อเปลี่ยนเป็นวัตถุวันที่จาวาสคริปต์
Unspeakable

1
อ้างตรวจสอบการเชื่อมโยงนี้momentjs.com/guides/#/warnings/js-date นี่คือกำลังใจและจะถูกลบออกในรุ่นใหญ่ที่จะเกิดขึ้น
gtzinos

3
@ gtzinos สิ่งที่คุณกำลังเชื่อมโยงและอ้างถึงเป็นปัญหาและสถานการณ์ที่แยกจากกันเช่นการส่งผ่านสตริงไปยังตัวสร้างช่วงเวลาmoment("12/12/2011")ซึ่งคุณจะได้รับข้อความนั้น มันไม่มีอะไรเกี่ยวข้องกับการไปจากวันที่ objmoment().toDate()
btbJosh

51

ตราบใดที่คุณเริ่มต้นช่วงเวลาขณะที่มีข้อมูลสำหรับโซนที่คุณต้องการรหัสของคุณทำงานตามที่คาดไว้

คุณแปลงช่วงเวลาให้เป็นเขตเวลาอย่างถูกต้องซึ่งจะปรากฏในบรรทัดที่สองของเอาต์พุต momentObj.format()คุณกำลังถูกต้องแปลงช่วงเวลาที่จะโซนเวลาซึ่งสะท้อนให้เห็นในบรรทัดที่สองของการส่งออกจาก

การเปลี่ยนเป็น UTC ไม่เพียงแค่ทำให้ออฟเซ็ตตก แต่จะเปลี่ยนกลับเป็นโซนเวลา UTC หากคุณกำลังจะทำเช่นนั้นคุณไม่จำเป็นต้องมี.tz()สายเดิมเลย คุณสามารถทำได้moment.utc()คุณก็สามารถทำ

บางทีคุณแค่พยายามเปลี่ยนสตริงรูปแบบผลลัพธ์หรือไม่ ถ้าเป็นเช่นนั้นเพียงระบุพารามิเตอร์ที่คุณต้องการใช้กับformatวิธีการ:

momentObj.format("YYYY-MM-DD HH:mm:ss")

เกี่ยวกับบรรทัดสุดท้ายของรหัสของคุณ - เมื่อคุณกลับไปที่Dateวัตถุที่ใช้toDate()คุณกำลังเลิกพฤติกรรมของ moment.js และกลับไปที่พฤติกรรมของ JavaScript จาวาสคริปต์Dateวัตถุจะถูกพิมพ์ในเขตเวลาท้องถิ่นของคอมพิวเตอร์ที่ทำงานอยู่เสมอ ไม่มีอะไรที่เป็นไปได้

สองสิ่งเล็ก ๆ น้อย ๆ อื่น ๆ :

  • ในขณะที่ตัวสร้างโมเมนต์ที่สามารถใช้เวลาDateได้จะเป็นการดีที่สุดที่จะไม่ใช้ตัวสร้าง สำหรับ "ตอนนี้" moment(new Date())ไม่ได้ใช้ ให้ใช้moment()แทน ทั้งสองจะทำงานได้ แต่มันซ้ำซ้อนโดยไม่จำเป็น หากคุณแยกวิเคราะห์จากสตริงส่งผ่านสตริงนั้นโดยตรง อย่าพยายามแยกมันเป็นDateครั้งแรก คุณจะพบว่าโปรแกรมแยกวิเคราะห์ช่วงเวลามีความน่าเชื่อถือมากขึ้น

  • เขตเวลาเช่นMST7MDTนั้นมีเหตุผลด้านความเข้ากันได้ย้อนหลัง มันมาจากเขตเวลาสไตล์ POSIX และมีเพียงไม่กี่แห่งเท่านั้นที่อยู่ในข้อมูล TZDB America/Denverยกเว้นในกรณีที่จำเป็นอย่างยิ่งที่คุณควรใช้เช่นคีย์


ขอบคุณแมตต์! คำตอบของคุณมีประโยชน์ ดังที่คุณพูดถึงการใช้ America / Denver แทน MST7MDT มีแผนที่สำหรับการแมปเหล่านี้หรือไม่? ฉันใช้เขตเวลาดังกล่าวค่อนข้างน้อยเช่น CET, EET, EST5EDT, CST6CDT, PST8PDT
monish001

เป็นไปได้หรือไม่ที่จะแปลงเช่น: "10:20 AM" (รับค่าสตริงเวลาจากช่วงเวลา () รูปแบบ ('hh: mm A')) เป็นวัตถุวันที่หรือไม่
ram

2
@ram - 1) .toDate()ถ้าคุณมีช่วงเวลาที่ใช้งานเพียงแค่ 2) อย่าใช้ความคิดเห็นเพื่อถามคำถามใหม่ นั่นคือสิ่งที่ปุ่ม"ถามคำถาม"ขนาดใหญ่มีไว้สำหรับ
Matt Johnson-Pint

22

.toDate ไม่ได้ผลสำหรับฉันดังนั้นนี่คือสิ่งที่ฉันทำ:

futureStartAtDate = new Date(moment().locale("en").add(1, 'd').format("MMM DD, YYYY HH:MM"))

หวังว่านี่จะช่วยได้


2
คำตอบนี้ไม่ตอบคำถาม moment().add(1, 'd').toDate()รหัสเป็นวิธีที่ยืดยาวของการเขียน
RobG

12

เนื่องจาก momentjs ไม่สามารถควบคุมวัตถุวันที่ของ javascript ได้ฉันจึงพบวิธีแก้ไขปัญหานี้

const currentTime = new Date();    
const convertTime = moment(currentTime).tz(timezone).format("YYYY-MM-DD HH:mm:ss");
const convertTimeObject = new Date(convertTime);

นี้จะให้วัตถุวันที่จาวาสคริปต์กับเวลาแปลง


2
นี่เป็นคำตอบเดียวที่ถูกต้องที่ตอบคำถามโดยตรง
Anish Sana

1
นี่คือสิ่งที่ฉันต้องการ ฉันคาดหวังว่าวันที่พื้นเมืองจะเป็นตัวแทนเขตเวลาอย่างถูกต้อง แต่ฉันผิดไปอย่างน่าเศร้า
mklbtz

1
รูปแบบ "YYYY-MM-DD HH: mm: ss" ไม่ได้รับการสนับสนุนจาก Safari ดังนั้นผลที่ได้คือnull รูปแบบควรเป็น "YYYY-MM-DDTHH: mm: ss" (ใช้รูปแบบที่รองรับ ECMAScript, "T" ระหว่างส่วนวันที่และเวลา)
RobG

4

ฉันต้องมีข้อมูลเขตเวลาในสตริงวันที่ของฉัน เดิมทีฉันใช้moment.tz(dateStr, 'America/New_York').toString();แต่แล้วฉันก็เริ่มได้รับข้อผิดพลาดเกี่ยวกับการป้อนสตริงนั้นกลับไปในทันที

ฉันลองmoment.tz(dateStr, 'America/New_York').toDate();แล้ว แต่ฉันสูญเสียข้อมูลเขตเวลาที่ฉันต้องการ

วิธีแก้ปัญหาเดียวที่ส่งคืนสตริงวันที่ที่ใช้งานได้พร้อมเขตเวลาที่สามารถป้อนกลับได้ในทันทีคือmoment.tz(dateStr, 'America/New_York').format();


4
let dateVar = moment('any date value');
let newDateVar = dateVar.utc().format();

สวยและสะอาด !!!!


นี่เป็นทางออกเดียวในกรณีของฉันที่มีรูปแบบ utc ขอบคุณ
Luis Febro

3

หากต้องการแปลงวันที่ใด ๆ เช่น utc:

moment( moment().utc().format( "YYYY-MM-DD HH:mm:ss" )).toDate()

2
สิ่งนี้ช่วยชีวิตฉันไว้ได้จริงๆ!
HV Sharma

คำตอบนี้ผิด ซึ่งจะใช้การชดเชยเขตเวลาสองครั้ง: moment().utc()ส่งคืนค่าสำหรับ UTC จากนั้น.format( "YYYY-MM-DD HH:mm:ss" )ส่งคืนสตริงที่ตั้งค่าเป็น UTC โดยไม่มีการชดเชยเขตเวลาจึงแยกวิเคราะห์เป็นท้องถิ่น ไม่ตรงกับรูปแบบช่วงเวลาเริ่มต้นดังนั้นจะถูกวิเคราะห์โดยตัวแยกวิเคราะห์ในตัว ไม่ตรงกับรูปแบบที่สนับสนุน ECMAScript ใด ๆ ดังนั้นการวิเคราะห์คำจึงขึ้นอยู่กับการใช้งาน อย่างไรก็ตามจะมีการแยกวิเคราะห์เป็นท้องถิ่นเพื่อให้การชดเชยเขตเวลาถูกนำมาใช้อีกครั้งเมื่อสร้างค่าเวลาของวันที่
RobG

3

คำถามนั้นค่อนข้างคลุมเครือ ฉันจะทำให้ดีที่สุดเพื่ออธิบายเรื่องนี้ แรกที่คุณควรเข้าใจวิธีการใช้ช่วงเวลา-เขตเวลา ตามคำตอบนี้ที่นี่ TypeError:. ช่วงเวลา () TZ ไม่ได้เป็นฟังก์ชั่นที่คุณต้องขณะที่นำเข้าจากช่วงเวลา-เขตแทนที่จะเป็นช่วงเวลาที่เริ่มต้น (ofcourse คุณจะต้องติดตั้ง NPM ขณะ-เขตเวลาแรก!) เพื่อประโยชน์ของความชัดเจน,

const moment=require('moment-timezone')//import from moment-timezone

ตอนนี้เพื่อใช้คุณสมบัติเขตเวลาใช้moment.tz ("date_string / moment ()", "time_zone") (ไปที่https://momentjs.com/timezone/สำหรับรายละเอียดเพิ่มเติม) ฟังก์ชั่นนี้จะคืนค่าวัตถุโมเมนต์ที่มีเขตเวลาเฉพาะ เพื่อประโยชน์ของความชัดเจน,

var newYork= moment.tz("2014-06-01 12:00", "America/New_York");/*this code will consider NewYork as the timezone.*/

ตอนนี้เมื่อคุณพยายามแปลง new York (วัตถุโมเมนต์) ด้วยโมเมนต์ของtoDate () (การแปลงรูปแบบ ISO 8601) คุณจะได้รับเวลาของ Greenwich, UK สำหรับรายละเอียดเพิ่มเติมไปที่บทความนี้https://www.nhc.noaa.gov/aboututc.shtmlเกี่ยวกับ UTC อย่างไรก็ตามหากคุณต้องการเวลาท้องถิ่นของคุณในรูปแบบนี้ (เวลานิวยอร์กตามตัวอย่างนี้) เพียงแค่เพิ่มเมธอด. utc (จริง)ด้วยอาร์กิวเมนต์จริงให้กับวัตถุช่วงเวลาของคุณ เพื่อประโยชน์ของความชัดเจน,

newYork.toDate()//will give you the Greenwich ,UK, time.

newYork.utc(true).toDate()//will give you the local time. according to the moment.tz method arg we specified above, it is 12:00.you can ofcourse change this by using moment()

กล่าวโดยสรุปคือmoment.tz จะพิจารณาเขตเวลาที่คุณระบุและเปรียบเทียบเวลาท้องถิ่นของคุณกับเวลาใน Greenwich เพื่อให้ผลลัพธ์ ฉันหวังว่านี้เป็นประโยชน์.


2

ขณะนี้อัปเดต js lib ตั้งแต่วันที่ 06/2018

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

หากคุณมีอิสระในการใช้ Angular5 + ให้ใช้คุณสมบัติ datePipe ได้ดีกว่าฟังก์ชั่นเขตเวลาที่นี่ ฉันต้องใช้ moment.js เพราะโปรเจ็กต์ของฉัน จำกัด ที่ Angular2 เท่านั้น


1

ลอง (ไม่มีformatขั้นตอน)

new Date(moment())


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