Moment.js tarih nesnesine dönüştür


696

Moment.js kullanarak doğru moment nesnesini timezonları olan bir tarih nesnesine dönüştüremiyorum. Doğru tarihi alamıyorum.

Misal:

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
Hangi çıktıyı bekliyorsunuz ve hangi çıktıyı alıyorsunuz?
Felix Kling

4
4 satır beni çıktı olsun: <code> (Tarih nesnesi) Ofset ile zaman Per 01 Ağu 2013 15:23:49 GMT + 0300 (Финляндия (лето)) </code> Ama saat dilimi MST7MDT olmalıdır
vadim.zhiltsov

Wednesday 24th 2019, 12:47:48 ambu dönüştürmek mümkün 2019-04-23T19:17:48.000Z mü? @ vadim.zhiltsov
Anupam Maurya

Tarih nesnelerinin bir saat dilimi yoktur, bunlar sadece 1970-01-01T00: 00: 00Z'den bir ofsettir. Bu nedenle, toDate öğesini çağırdığınızda , döndürülen nesne, moment nesnesine eklediğiniz saat dilimi bilgilerini kaybetti .tz("MST7MDT"). Bu nedenle, yalnızca UTC ve ana bilgisayar saat dilimini anlayan yerleşik Date nesnesinin çıplak kemik yeteneklerini desteklemek için moment.tz gibi kütüphaneler var.
RobG

Yanıtlar:


1236

Bir moment nesnesini bir tarih nesnesine dönüştürmek için bunu kullanın:

Gönderen http://momentjs.com/docs/#/displaying/as-javascript-date/

moment().toDate();

Verim:

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

11
@Spencer - Evet, başlığa cevap veriyor ve toDategerçekten bir Datenesneden nasıl bir nesne alacağınız moment. Ancak sorunun gövdesindeki kod, saat dilimi dönüşümünü sorar - bu Dateyapamaz. Dağ saati gerçekten kullanıcının saat dilimi olmadığı sürece, bunun soruyu nasıl yanıtladığını bilmiyorum.
Matt Johnson-Pint

1
@Matt sadece sorunun hangi kısmına baktığınıza bağlıdır. İnsanların çoğu google'da arama yapar ve bu başlığın sorularıyla aynı hizaya geldiğini ve sorunun gövdesine değil başlığa cevap veren cevabı onayladığını görür. Teknik olarak OP'ye yardımcı olmasa da, bunun neden en yüksek oylara sahip olduğunu açıklayabilir.
Spencer

14
Bu gerçekten doğru cevap mı? Soru, moment nesnesinin bir javascript tarihine nasıl dönüştürüleceğiydi, ancak TIMEZONE ile. Javascript tarih nesnesine geçildiğinde yine de yerel saat dilimine geri döner.
Tarifsiz

1
Merhaba arkadaşlar momentjs.com/guides/#/warnings/js-date bağlantısını kontrol edin . Bu cesaretiniz kırıldı ve önümüzdeki büyük sürümde kaldırılacak.
gtzinos

3
@gtzinos bağlandığınız ve atıfta bulunduğunuz şey ayrı bir sorun ve senaryodur, örneğin moment oluşturucuya bir dize iletmek moment("12/12/2011")o mesajı alacağınız yerdir. O andan bugüne obj ile gidiş ile ilgisi yokturmoment().toDate()
btbJosh

51

Sürece başlatıldı gibi an-dilimini ile istediğiniz bölgeleri için veri beklendiği gibi, kodunuz işler.

Anı, ikinci çıkış satırına yansıyan saat dilimine doğru şekilde dönüştürüyorsunuz momentObj.format().

UTC'ye geçmek sadece ofseti düşürmekle kalmaz, tekrar UTC saat dilimine döner. Bunu yapacaksanız, orijinal .tz()görüşmeye ihtiyacınız yoktur . Sadece yapabilirsin moment.utc().

Belki de sadece çıktı biçimi dizesini değiştirmeye çalışıyorsunuz? Öyleyse, formatyöntem için istediğiniz parametreleri belirtin :

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

Kodunuzun son satırlarına gelince - Datekullanarak bir nesneye toDate()geri döndüğünüzde moment.js'nin davranışından vazgeçiyor ve JavaScript'in davranışına geri dönüyorsunuz. Bir JavaScript Datenesnesi her zaman üzerinde çalıştığı bilgisayarın yerel saat diliminde yazdırılır. Moment.js'nin bu konuda yapabileceği hiçbir şey yok.

Birkaç küçük şey daha:

  • An yapıcısı iken edebilir bir alacak Date, bu birini kullanmak değil genellikle en iyisidir. "Şimdi" için kullanmayın moment(new Date()). Bunun yerine, sadece kullanın moment(). Her ikisi de işe yarayacak, ancak gereksiz yere gereksiz. Bir dizeden ayrıştırma yapıyorsanız, o dizeyi doğrudan anaya geçirin. DateBirincisine ayrıştırmaya çalışmayın . Anın ayrıştırıcısını çok daha güvenilir bulacaksınız.

  • Gibi Zaman Dilimleri MST7MDTgeriye dönük uyumluluk nedeniyle vardır. POSIX stili saat dilimlerinden kaynaklanır ve bunlardan sadece birkaçı TZDB verilerindedir. Kesinlikle gerekli olmadıkça, gibi bir anahtar kullanmalısınız America/Denver.


Teşekkürler Matt! Cevabınız faydalı oldu. MST7MDT yerine America / Denver kullanımından bahsettiğiniz gibi, bu eşlemeler için bir harita var mı? CET, EET, EST5EDT, CST6CDT, PST8PDT gibi birkaç zaman dilimi kullanıyorum.
monish001

örneğin: "10:20 AM" (moment (). biçiminden ('ss: dd A')) Tarih nesnesine elde edilen dize zamanını dönüştürmek mümkün mü ??
Koç

2
@ram - 1) bir anınız varsa, sadece kullanın .toDate(). 2) Yeni sorular sormak için yorumları kullanmayın. Büyük "Soru Sor" düğmesinin amacı budur.
Matt Johnson-Pint

22

.toDate gerçekten benim için çalışmadı, Yani, İşte yaptım:

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

Bu yardımcı olur umarım


2
Bu cevap soruyu cevaplamıyor. Kod uzun soluklu bir yazım şeklidir moment().add(1, 'd').toDate().
RobG

12

Momentjs javascript date nesnesi üzerinde herhangi bir kontrole sahip olmadığından bu konuda bir çözüm buldum.

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

Bu size dönüştürülen zamana sahip bir javascript tarih nesnesi verecektir


2
Soruyu doğrudan cevaplayan tek doğru cevap budur.
Anish Sana

1
Bu tam olarak istediğim şeydi. Yerel Tarihlerin saat dilimlerini doğru bir şekilde temsil etmesini bekliyordum, ama ne yazık ki yanılmışım.
mklbtz

1
"YYYY-AA-GG SS: dd: ss" biçimi Safari tarafından desteklenmediği için sonuç null olur . Biçim "YYYY-AA-GGTHY: dd: ss" olmalıdır (ECMAScript destekli bir biçim, tarih ve saat bölümleri arasında bir "T" kullanın).
RobG

4

Tarih dizemde saat dilimi bilgisine sahip olmam gerekiyordu. Başlangıçta kullanıyordum moment.tz(dateStr, 'America/New_York').toString();ama sonra o dizeyi tekrar tekrar besleme konusunda hatalar almaya başladım.

Denedim moment.tz(dateStr, 'America/New_York').toDate();ama sonra ihtiyacım olan saat dilimi bilgilerini kaybettim.

Zaman dilimine sahip, kullanılabilir bir tarih dizesi döndüren tek çözüm ,moment.tz(dateStr, 'America/New_York').format();


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

güzel ve temiz !!!!


Bu benim durumumda utc formatına sahip olan tek çözümdü. Teşekkürler
Luis Febro

3

Herhangi bir tarihi dönüştürmek için, örneğin utc:

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

2
Bu gerçekten benim günümü kurtardı!
HV Sharma

Bu cevap yanlış. Saat dilimi uzaklığını iki kez uygular: moment().utc()UTC değerlerini döndürür, ardından .format( "YYYY-MM-DD HH:mm:ss" )saat dilimi uzaklığı olmadan UTC'ye ayarlanmış ve yerel olarak ayrıştırılan bir dize döndürür. Varsayılan bir moment biçimiyle eşleşmediğinden yerleşik ayrıştırıcı tarafından ayrıştırılır. ECMAScript tarafından desteklenen biçimlerle de eşleşmediğinden, ayrıştırma uygulamaya bağlıdır. Her neyse, yerel olarak ayrıştırılır, böylece Tarih saat değeri oluşturulurken saat dilimi farkı yeniden uygulanır.
RobG

3

Soru biraz belirsiz. Bunu açıklamak için elimden geleni yapacağım. İlk önce moment-zaman dilimini nasıl kullanacağınızı anlamalısınız . Bu cevaba göre TypeError: moment (). Tz bir işlev değildir , varsayılan an yerine moment-zaman diliminden anı içe aktarmanız gerekir (tabii ki önce moment-zaman dilimini npm yüklemeniz gerekir!). Anlaşılır olması adına,

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

Şimdi saat dilimi özelliğini kullanmak için moment.tz ("date_string / moment ()", "time_zone") kullanın ( daha fazla bilgi için https://momentjs.com/timezone/ adresini ziyaret edin ). Bu işlev, belirli bir saat dilimine sahip bir moment nesnesi döndürür. Anlaşılır olması adına,

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

Şimdi newYork'u ( moment nesnesi) moment toDate () (ISO 8601 formatı dönüştürme) ile dönüştürmeye çalıştığınızda Greenwich, İngiltere zamanını alacaksınız. Daha fazla ayrıntı için https://www.nhc.noaa.gov/aboututc.shtml , UTC hakkında bu makaleyi okuyun . Ancak yerel saatinizi yalnızca bu biçimde (bu örneğe göre New York saati) istiyorsanız, moment nesnesine .utc (true) yöntemini arg true ile eklemeniz yeterlidir . Anlaşılır olması adına,

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

Kısacası moment.tz , belirlediğiniz saat dilimini dikkate alır ve size bir sonuç vermek için yerel saatinizi Greenwich'teki saatle karşılaştırır. Umarım faydalı olmuştur.


2

an, 06/2018 itibarıyla js lib'i güncelledi.

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 + 'ı kullanma özgürlüğünüz varsa, burada saat dilimi işlevinden daha iyi datePipe özelliğini kullanın. Moment.js kullanmalıyım çünkü projem sadece Angular2 ile sınırlı.


1

dene ( formatadım olmadan )

new Date(moment())


new Date(moment())eşittir new Date(). Saat dilimi yalnızca d için ayarlanır .
RobG
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.