2015-10-01 14 views
8

Zaman ofseti ile uğraşmak için moment.js kullanmaya çalışan bir sorunla karşı karşıyayım. (Benim durumumda değeri -240 olduğu içinde)Anlık olarak zaman ofseti güncelleniyor() utcOffset()

<script type="text/javascript"> 
    $(document).ready(function() { 
    $('input#timeoffset').val(moment().utcOffset()); 
    }); 
</script> 

doğru depolanır offset:

Bir gizli girişteki ofset yerel kullanıcı süresini toplar. Daha sonra bazı db utcDate böyle bir şey yaptığını saklanan güncellemeyi deneyin (utc zaman içinde çalışır) sunucu tarafında:

var userDate = moment(utcDate).utcOffset(offset) 

Benim konuyla şudur: Benim kod çalıştırırsanız yukarıdaki gibi hiçbir etkisi olsun anlatılan : Ben ofset işareti çevirin

  • utcDate: 20151001 012421 +0000
  • userDate: 20151001 012421 +0000

alıyorum:

  • utcDate: 20151001 012421 +0000
  • Açıkça (beklentim ilk sürümü doğru olmasıydı bile) yanlış bir şey yapıyorum
  • userDate: 20151001 052421 +0400

, herhangi bir ipucu var mı?

Ben moment.js v2.10.6 kullanıyorum istemci tarafında

ise sunucu tarafında an-timezone.js v0.4.0 ve moment.js v2.10.6 üzerinde

+0

Ofset'i uyguladıktan sonra 'userDate' ile ne yaparsınız? Muhtemelen 'toDate', 'valueOf', 'unix' ya da duvarı zamandan ziyade anı yansıtan diğer yöntemleri çağırıyorsunuzdur. –

+0

Ayrıca, "saat dilimi! = Kayma" yı hatırlayın.Kullanıcının * geçerli * ofsetini saklar ve daha sonra bunu zamanında rastgele bir noktaya uygularsanız, o zaman için yanlış bir sapma olabilir. Zaman dilimleri, gün ışığından yararlanma saati ve diğer çeşitli nedenlerden dolayı ofsetleri değiştirebilir. –

+0

@MattJohnson aslında ben sadece .format (...) 'sonuçları yazdırmak için. Yukarıda bildirdiğim sonuçlar şöyle yazılır: 'console.log ('utcDate:' + moment (utcDate) .format ('YYYYMMDD HHmmss ZZ')); console.log ('userDate:' + moment (utcDate) .utcOffset (ofset) .format ('YYYYMMDD HHmmss ZZ')); '. 'UtcDate' ofsetsizdir. – Pierluigi

cevap

10

ana sorun, olmasıdır Ofsetin bir sayı yerine bir dize olarak geçirilmesi.

moment.utc("2015-10-01 01:24:21").utcOffset("-240").format('YYYYMMDD HHmmss ZZ') 
// "20151001 012421 +0000" 

moment.utc("2015-10-01 01:24:21").utcOffset(-240).format('YYYYMMDD HHmmss ZZ') 
// "20150930 212421 -0400" 

Dakika cinsinden bir sapma olduğunda, sayısal formu kullanmanız gerekir. uzaklıklar dizeleri olarak geçirilecek için

moment.utc("2015-10-01 01:24:21").utcOffset(+"-240").format('YYYYMMDD HHmmss ZZ') 
// "20150930 212421 -0400" 

Moment izin verse de onları ISO8601 biçimlerinden birinde olmasını bekler: Her zaman dönüştürebilirsiniz [+/-]HH:mm veya [+/-]HHmm ya. Ayrıca

moment.utc("2015-10-01 01:24:21").utcOffset("-04:00").format('YYYYMMDD HHmmss ZZ') 
// "20150930 212421 -0400" 

, ben giriş dizesi ayrıştırmak için moment.utc(...) kullanılmış bir para. Saat dilimi açık değilse veya Date nesnesini bir dize yerine iletmezseniz, yerel zaman dilimini kullanacak olan moment(...) kullandınız. Ayrıca moment nesnesini "yerel modda" bırakacak, böylece utcDate çıktınız aslında makinenin saat dilimi UTC olarak ayarlanmadığı sürece yanlış olur.

Son olarak, "Time Zone! = Offset" seçeneğini unutmayın. Aldığınız ofsetin tüm tarihler için geçerli olduğunu varsayamazsınız. Bir tarihi kullanıcının saat dilimine yansıtmanız gerekirse, America/New_York gibi saat dilimini bilmeniz gerekir. Bunları zaman-zaman dilimi eklentisi ile kullanabilirsiniz.

+0

Sadece bunun tam olarak benim hata olduğumu, parseInt 'olmadığını ve bir yönde çalıştığını, diğerinde ise' ofset'in bir dizi olduğunu anladım! Teşekkür ederim! – Pierluigi

İlgili konular