Moment.js berubah menjadi objek tanggal

696

Menggunakan Moment.js saya tidak bisa mengubah objek momen yang benar menjadi objek tanggal dengan zona waktu. Saya tidak bisa mendapatkan tanggal yang benar.

Contoh:

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())
vadim.zhiltsov
sumber
1
Output apa yang Anda harapkan dan output apa yang Anda dapatkan?
Felix Kling
4
4 baris buat saya jadi keluaran: <code> (Objek tanggal) Waktu dengan offset Kamis 01 Agustus 2013 15:23:49 GMT + 0300 (Финляндия (лето)) </code> Tetapi zona waktu harus MST7MDT
vadim.zhiltsov
Wednesday 24th 2019, 12:47:48 amapakah ini mungkin untuk dikonversi menjadi 2019-04-23T19:17:48.000Z ? @ vadim.zhiltsov
Anupam Maurya
Objek tanggal tidak memiliki zona waktu, mereka hanya offset dari 1970-01-01T00: 00: 00Z. Jadi ketika Anda menelepon toDate , objek yang dikembalikan telah kehilangan informasi zona waktu yang Anda lampirkan pada objek saat itu .tz("MST7MDT"). Itu sebabnya perpustakaan seperti moment.tz ada, untuk melengkapi kemampuan tulang telanjang objek Date bawaan yang hanya memahami UTC dan zona waktu host, hanya itu.
RobG

Jawaban:

1235

Gunakan ini untuk mengubah objek momen menjadi objek tanggal:

Dari http://momentjs.com/docs/#/displaying/as-javascript-date/

moment().toDate();

Hasil:

Tue Nov 04 2014 14:04:01 GMT-0600 (CST)
Chandrew
sumber
11
@Spencer - Ya, itu menjawab judul, dan toDatememang cara mendapatkan Dateobjek dari a moment. Tetapi kode di badan pertanyaan menanyakan tentang konversi zona waktu - yang Datetidak bisa dilakukan. Kecuali waktu Gunung memang zona waktu pengguna, maka saya tidak yakin bagaimana ini menjawab pertanyaan.
Matt Johnson-Pint
1
@Matt itu hanya tergantung pada bagian mana dari pertanyaan yang Anda lihat. Mayoritas orang mencari Google dan melihat bahwa judul ini sejalan dengan pertanyaan mereka dan mengambil jawaban yang menjawab judul, bukan badan pertanyaan. Itu mungkin menjelaskan mengapa ini memiliki upvotes paling banyak meskipun secara teknis tidak membantu OP.
Spencer
14
Apakah ini jawaban yang benar? Pertanyaannya adalah bagaimana mengubah objek momen ke tanggal javascript tetapi dengan TIMEZONE. Itu masih kembali ke zona waktu lokal ketika mengubah ke objek tanggal javascript.
Tak terkatakan
1
Hai teman-teman, periksa tautan ini momentjs.com/guides/#/warnings/js-date . Ini tidak disarankan dan akan dihapus dalam rilis besar mendatang.
gtzinos
3
@ gtzinos yang Anda tautkan dan rujuk adalah masalah dan skenario yang terpisah, misal meneruskan string ke konstruktor momen moment("12/12/2011")adalah tempat Anda mendapatkan pesan itu. Ini tidak ada hubungannya dengan pergi dari saat ke tanggal moment().toDate()
keberatan
51

Selama Anda menginisialisasi zona waktu saat dengan data untuk zona yang Anda inginkan , kode Anda berfungsi seperti yang diharapkan.

Anda mengubah momen dengan benar ke zona waktu, yang tercermin pada baris kedua dari keluaran momentObj.format().

Beralih ke UTC tidak hanya menjatuhkan offset, tetapi juga kembali ke zona waktu UTC. Jika Anda akan melakukan itu, Anda tidak perlu .tz()sama sekali panggilan asli . Anda bisa melakukannya moment.utc().

Mungkin Anda hanya mencoba mengubah string format output? Jika demikian, cukup tentukan parameter yang Anda ingin formatmetode:

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

Mengenai baris terakhir ke kode Anda - ketika Anda kembali ke Dateobjek menggunakan toDate(), Anda melepaskan perilaku moment.js dan kembali ke perilaku JavaScript. DateObjek JavaScript akan selalu dicetak dalam zona waktu lokal dari komputer yang digunakan. Tidak ada momen. Aku bisa melakukan itu.

Beberapa hal kecil lainnya:

  • Sementara konstruktor momen dapat mengambil Date, biasanya yang terbaik adalah tidak menggunakannya. Untuk "sekarang", jangan gunakan moment(new Date()). Sebaliknya, gunakan saja moment(). Keduanya akan bekerja tetapi tidak perlu berlebihan. Jika Anda mem-parsing dari string, berikan string itu langsung ke saat. Jangan mencoba menguraikannya menjadi yang Datepertama. Anda akan menemukan pengurai momen jauh lebih dapat diandalkan.

  • Zona Waktu seperti MST7MDTada untuk alasan kompatibilitas ke belakang. Mereka berasal dari zona waktu gaya POSIX, dan hanya beberapa dari mereka yang ada di data TZDB. Kecuali mutlak diperlukan, Anda harus menggunakan kunci seperti America/Denver.

Matt Johnson-Pint
sumber
Terima kasih, Matt! Jawaban Anda bermanfaat. Seperti yang Anda sebutkan tentang menggunakan America / Denver, bukan MST7MDT, Apakah ada peta yang tersedia untuk pemetaan ini? Saya menggunakan beberapa zona waktu seperti CET, EET, EST5EDT, CST6CDT, PST8PDT.
monish001
apakah mungkin untuk mengkonversi misalnya: "10:20" (Memperoleh string time dari moment (). format ('hh: mm A')) ke objek Date ??
ram
2
@ram - 1) jika ada waktu, gunakan saja .toDate(). 2) Jangan menggunakan komentar untuk mengajukan pertanyaan baru. Untuk itulah tombol "Ajukan Pertanyaan" yang besar itu.
Matt Johnson-Pint
22

.toDate tidak benar-benar bekerja untuk saya, Jadi, Inilah yang saya lakukan:

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

semoga ini membantu

Mawaheb
sumber
2
Jawaban ini tidak menjawab pertanyaan. Kode ini merupakan cara penulisan yang panjang lebar moment().add(1, 'd').toDate().
RobG
12

Karena momentjs tidak memiliki kontrol atas objek tanggal javascript saya menemukan pekerjaan untuk ini.

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

Ini akan memberi Anda objek tanggal javascript dengan waktu yang dikonversi

Yasith Prabuddhaka
sumber
2
Ini adalah satu-satunya jawaban yang benar yang langsung menjawab pertanyaan.
Anish Sana
1
Inilah yang saya inginkan. Saya mengharapkan Tanggal asli untuk mewakili zona waktu dengan benar, tetapi sayangnya saya salah.
mklbtz
1
Format "YYYY-MM-DD HH: mm: ss" tidak didukung oleh Safari, jadi hasilnya nol . Formatnya harus "YYYY-MM-DDTHH: mm: ss" (gunakan format yang didukung ECMAScript, "T" antara tanggal dan bagian waktu).
RobG
4

Saya perlu memiliki informasi zona waktu di string tanggal saya. Saya awalnya menggunakan moment.tz(dateStr, 'America/New_York').toString();tetapi kemudian saya mulai mendapatkan kesalahan tentang memberi makan string itu kembali ke saat.

Saya mencoba moment.tz(dateStr, 'America/New_York').toDate();tetapi kemudian saya kehilangan informasi zona waktu yang saya butuhkan.

Satu-satunya solusi yang mengembalikan string tanggal yang dapat digunakan dengan zona waktu yang dapat dimasukkan kembali ke saat itu adalahmoment.tz(dateStr, 'America/New_York').format();

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

bagus dan bersih !!!!

Emerson Bottero
sumber
Ini adalah satu-satunya solusi di sini dalam kasus saya yang berhasil memiliki format utc. Terima kasih
Luis Febro
3

Untuk mengonversi tanggal apa pun, misalnya utc:

moment( moment().utc().format( "YYYY-MM-DD HH:mm:ss" )).toDate()
kizoso
sumber
2
Ini benar-benar menyelamatkan hariku!
HV Sharma
Jawaban ini salah. Ini menerapkan offset zona waktu dua kali: moment().utc()mengembalikan nilai untuk UTC, lalu .format( "YYYY-MM-DD HH:mm:ss" )mengembalikan string yang telah diatur ke UTC tanpa offset zona waktu sehingga diuraikan sebagai lokal. Itu tidak cocok dengan format momen default sehingga diurai oleh pengurai bawaan. Ini juga tidak cocok dengan format yang didukung ECMAScript, jadi penguraian tergantung pada implementasi. Lagi pula, ini diuraikan sebagai lokal sehingga offset zona waktu diterapkan kembali saat membuat nilai waktu Tanggal.
RobG
3

Pertanyaannya sedikit tidak jelas. Saya akan melakukan yang terbaik untuk menjelaskan ini. Pertama, Anda harus memahami cara menggunakan zona waktu-saat . Menurut jawaban ini di sini TypeError: moment (). Tz bukan fungsi , Anda harus mengimpor momen dari moment-timezone alih - alih momen default (ofcourse Anda harus menginstal npm moment-timezone terlebih dahulu!). Demi kejelasan,

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

Sekarang untuk menggunakan fitur zona waktu, gunakan moment.tz ("date_string / moment ()", "time_zone") (kunjungi https://momentjs.com/timezone/ untuk lebih jelasnya). Fungsi ini akan mengembalikan objek momen dengan zona waktu tertentu. Demi kejelasan,

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

Sekarang ketika Anda mencoba mengonversi newYork (objek momen) dengan toDate momen () (konversi format ISO 8601), Anda akan mendapatkan waktu di Greenwich, Inggris. Untuk lebih jelasnya, baca artikel ini https://www.nhc.noaa.gov/aboututc.shtml , tentang UTC. Namun jika Anda hanya ingin waktu lokal Anda dalam format ini (waktu New York, sesuai dengan contoh ini), tambahkan saja metode .utc (true) , dengan arg true , ke objek momen Anda. Demi kejelasan,

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()

Singkatnya, moment.tz mempertimbangkan zona waktu yang Anda tentukan dan membandingkan waktu lokal Anda dengan waktu di Greenwich untuk memberi Anda hasil. Saya harap ini bermanfaat.

Vijay Joshua Nadar
sumber
2

moment telah memperbarui js lib pada 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

jika Anda memiliki kebebasan untuk menggunakan Angular5 +, maka lebih baik gunakan fitur datePipe di sana daripada fungsi zona waktu di sini. Saya harus menggunakan moment.js karena proyek saya hanya terbatas pada Angular2.

Feng Zhang
sumber
1

coba (tanpa formatlangkah)

new Date(moment())

Kamil Kiełczewski
sumber
new Date(moment())setara dengan new Date(). Zona waktu hanya ditetapkan untuk d .
RobG