Moment: Tidak dapat menemukan singkatan zona waktu dari Date.prototype.toString ()

Dibuat pada 6 Feb 2012  ·  33Komentar  ·  Sumber: moment/moment

Halo, saya menemukan situs moment.js melalui forum dan mengkliknya, ketika saya menemukan pengujian unit - yang gagal 2 tes apa yang ingin saya laporkan di sini:

Agen pengguna:
Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 535.7 (KHTML, seperti Gecko) Chrome / 16.0.912.77 Safari / 535.7 (Chrome 16.0.912.77 m)

Zona waktu:
UTC + 1

Tes yang gagal (# 28):
http://pastebin.com/bQsDuxdH

* Judul diedit oleh timrwood

Bug

Komentar yang paling membantu

Pertanyaan bodoh: mengapa perpustakaan yang sama sekali baru? Bukankah momen untuk menyelesaikan semua kebutuhan penanganan tanggal dan waktu seseorang? Sementara file data menambahkan jumlah ruang yang tidak sepele (dan saya dapat memahami memisahkannya), perpustakaan baru itu sendiri <2k, jadi ruang tampaknya tidak menjadi alasan untuk memisahkannya.

Tampaknya agak menyedihkan bahwa seseorang yang hanya ingin menghasilkan string tanggal dengan zona waktu di dalamnya harus mengunduh dua perpustakaan terpisah dan file data untuk melakukan apa yang seharusnya sudah ada di Javascript.

Juga, bagaimana cara menggunakan perpaduan perpustakaan baru ini untuk menghasilkan string tanggal sederhana? Sebelum saya bisa menghasilkan:

Sun, 06 Nov 1994 08:49:37 GMT

dengan:

moment().format('ddd, DD MMM YYYY HH:mm:ss z');

Tapi sekarang saya bingung bagaimana saya harus melakukan itu tanpa opsi format "z". Bantuan apa pun akan dihargai.

Semua 33 komentar

Hmm, sepertinya singkatan zona waktu gagal. Maaf untuk melakukan debug jarak jauh, tetapi apa keluaran dari berikut ini di chrome?

new Date().toString()

Juga, apa nama zona waktu Anda?

Saya mendapatkan kesalahan yang sama dalam pengujian unit dan saya juga menggunakan UTC + 1 (sebelumnya dikenal sebagai GMT + 1).

Tanggal baru (). toString () mencetak "Sab 11 Feb 2012 02:15:10 GMT + 0100" di Firefox 10, "Sab 11 Feb 2012 02:18:29 GMT + 0100 (W. Waktu Standar Eropa)" di Chrome 16 dan "Sab 11 Feb 02:18:59 UTC + 0100 2012" di Internet Explorer 9

Hmm, saya takut dengan ini. Masalahnya adalah bahwa Date.prototype.toString mengembalikan hasil yang berbeda. Itu adalah satu-satunya tempat untuk mendapatkan nama zona waktu (PST, CST, EST, dll). Jika metode ini tidak mengembalikan informasi zona waktu apa pun (seperti halnya dengan FF10 dan IE9, tidak ada cara untuk mendapatkannya.

Mungkin sudah waktunya untuk terdepresiasi? Atau apakah dapat diterima untuk hanya mencatat masalahnya di dokumen?

4318 berlalu, 2 gagal. 2715 milidetik.

Mozilla / 5.0 (Windows NT 6.1) AppleWebKit / 535.11 (KHTML, seperti Gecko) Chrome / 17.0.963.56 Safari / 535.11

UTC +2 (Kyiv, Ukraina)

format zona waktu 2 berlalu, 2 gagal.
---> Sesuatu seperti "PST"
AssertionError: ---> Sesuatu seperti "PST"
di Object.ok (http://momentjs.com/js/tests.js?_=120203_183019:1526:39)
di http://momentjs.com/js/tests.js?_=120203_183019:2413:14
di Object.runTest (http://momentjs.com/js/tests.js?_=120203_183019:1702:9)
di http://momentjs.com/js/tests.js?_=120203_183019:1748:25
di http://momentjs.com/js/tests.js?_=120203_183019:1006:13
di http://momentjs.com/js/tests.js?_=120203_183019:616:13
di http://momentjs.com/js/tests.js?_=120203_183019:627:25
di http://momentjs.com/js/tests.js?_=120203_183019:1008:17
di http://momentjs.com/js/tests.js?_=120203_183019:1589:17
---> Sesuatu seperti "PST"
AssertionError: ---> Sesuatu seperti "PST"
di Object.ok (http://momentjs.com/js/tests.js?_=120203_183019:1526:39)
di http://momentjs.com/js/tests.js?_=120203_183019:2414:14
di Object.runTest (http://momentjs.com/js/tests.js?_=120203_183019:1702:9)
di http://momentjs.com/js/tests.js?_=120203_183019:1748:25
di http://momentjs.com/js/tests.js?_=120203_183019:1006:13
di http://momentjs.com/js/tests.js?_=120203_183019:616:13
di http://momentjs.com/js/tests.js?_=120203_183019:627:25
di http://momentjs.com/js/tests.js?_=120203_183019:1008:17
di http://momentjs.com/js/tests.js?_=120203_183019:1589:17
+02: 00 ---> Sesuatu seperti "+07: 30"
+0200 ---> Sesuatu seperti "+0700"

Saya juga mendapatkan tes gagal yang sama # 28. Zona waktu saya adalah GMT -3.

Agen:
Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 535.11 (KHTML, seperti Gecko) Chrome / 17.0.963.66 Safari / 535.11

Tes gagal: http://pastebin.com/dsWHMF3h

.:.

Agen:
Mozilla / 5.0 (Windows NT 6.1; WOW64; rv: 10.0.2) Gecko / 20100101 Firefox / 10.0.2
atau
Mozilla / 5.0 (kompatibel; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4. 0C; Zune 4.7; .NET4.0E)

Tes gagal: http://pastebin.com/6t6JP9fu

Jadi sepertinya ini terjadi di UTC + 1, UTC + 2, dan UTC-3.

Sayangnya, sekarang ada cara untuk memperbaikinya. Itu tergantung pada peretasan keluaran Date().toString() , dan jika tidak ada informasi zona waktu yang tersedia dalam string itu, tidak ada cara untuk mendapatkan informasi itu.

Saya akan mengurangi fitur ini dan mungkin membuat plugin yang memiliki hasil yang lebih andal (meskipun mungkin kurang akurat). Mungkin harus seperti https://github.com/mde/timezone-js.

Token z zz tidak digunakan lagi mulai 1.6.0. Sebagai hasilnya, saya menutup masalah ini.

Bagaimana dengan node.js? Apakah z zz dapat diandalkan atau tidak dalam lingkungan ini?

Mereka telah secara resmi tidak digunakan lagi, jadi mereka tidak akan berfungsi pada versi 1.6.0.

Untuk versi kode sebelumnya, saya membayangkan hasilnya juga akan tidak konsisten, karena Node menggunakan V8 dan beberapa hasil yang tidak konsisten di atas ada di Chrome, yang juga menggunakan V8.

Terima kasih. Jadi untuk string seperti Thu Jan 10 2013 22:54:11 GMT+0100 (CET) , yang akhirnya saya lakukan adalah menghapus string zona waktu dengan regexp (di sini (CET) dengan spasi di depan) dan hanya menyisakan info timeshift (di sini +0100 ). Apakah menurut Anda itu cukup untuk moment.js atau apakah saya mengambil risiko inkonsistensi?

Hmm, saya tidak yakin apa yang Anda coba lakukan, apakah Anda mencoba mendapatkan CET atau +0100 ?

+0100 didukung melalui token ZZ (perhatikan kapitalisasi) dan berfungsi dengan baik saat parsing dan pemformatan.

CET tidak digunakan lagi karena kami tidak bisa mendapatkannya dari Date.toString . Namun, karena kami menggunakan Date.getTimezoneOffset untuk +0100 , dukungannya jauh lebih konsisten.

Saya melakukan seperti yang Anda katakan, menggunakan ZZ untuk +0100 dan menghapus CET dari string untuk mengurai. Apakah masuk akal ?

Mohon maaf, saya masih belum mengerti apa masalahnya di sini. Apakah Anda mencoba mengurai Thu Jan 10 2013 22:54:11 GMT+0100 (CET) ? Anda seharusnya bisa melakukan hal berikut.

moment('Thu Jan 10 2013 22:54:11 GMT+0100 (CET)', 'ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');

Inilah tepatnya yang saya lakukan di akhir. Sepertinya Anda mengonfirmasi bahwa saya melakukan hal yang benar. Permintaan maaf saya Jika saya tidak jelas, terima kasih atas jawabannya!

Tidak masalah!

@ hughanderson4 , masalahnya adalah browser tidak selalu mengembalikan singkatan zona waktu dari Date.prototype.toString . Karena kami tidak bisa mendapatkan singkatan zona waktu yang andal, singkatan itu tidak digunakan lagi.

Sejak itu, zona waktu momen telah dibuat untuk menambahkan dukungan zona waktu untuk moment.js. Anda mungkin ingin melihatnya untuk melihat apakah itu sesuai dengan kebutuhan Anda.

Bagaimana seseorang mengonversi momen.utc () menjadi waktu lokal dan menampilkan singkatan zona waktu?

Pertanyaan bodoh: mengapa perpustakaan yang sama sekali baru? Bukankah momen untuk menyelesaikan semua kebutuhan penanganan tanggal dan waktu seseorang? Sementara file data menambahkan jumlah ruang yang tidak sepele (dan saya dapat memahami memisahkannya), perpustakaan baru itu sendiri <2k, jadi ruang tampaknya tidak menjadi alasan untuk memisahkannya.

Tampaknya agak menyedihkan bahwa seseorang yang hanya ingin menghasilkan string tanggal dengan zona waktu di dalamnya harus mengunduh dua perpustakaan terpisah dan file data untuk melakukan apa yang seharusnya sudah ada di Javascript.

Juga, bagaimana cara menggunakan perpaduan perpustakaan baru ini untuk menghasilkan string tanggal sederhana? Sebelum saya bisa menghasilkan:

Sun, 06 Nov 1994 08:49:37 GMT

dengan:

moment().format('ddd, DD MMM YYYY HH:mm:ss z');

Tapi sekarang saya bingung bagaimana saya harus melakukan itu tanpa opsi format "z". Bantuan apa pun akan dihargai.

Jadi, menanyakan hanya untuk memastikan saya mengerti: Tidak ada pengganti untuk format 'z' yang sudah usang?

Jika saya memiliki stempel waktu dalam format ISO-8601, seperti:

2014-07-25T18:00:00-04:00

Dan saya ingin menampilkan cap waktu ini sebagai berikut:

6:00 PM EST

Apakah momen tidak lagi mendukung pemformatan ini? Semua data zona waktu disertakan dalam stempel waktu saya, dan saya hanya ingin menampilkannya secara langsung tanpa mengubah zona waktu dengan cara apa pun.

Itu sebenarnya tidak termasuk zona waktu. Ada beberapa nama zona waktu yang sesuai dengan perbedaan UTC yang sama, terutama saat mempertimbangkan kemungkinan DST yang berbeda-beda. Anda tidak dapat menyimpulkan dari "UTC-4: 00" bahwa zona waktunya adalah EST.

Untuk klarifikasi, pemformat z masih berfungsi saat menggunakan zona waktu saat dengan zona tertentu - karena singkatan dapat ditarik dari data zona waktu.

Sebutkan ini sekarang - jika Anda menggunakan
new Date().toTimeString()
Anda mendapatkan hasil yang sama di semua browser sejauh yang saya coba.

Artinya, Anda mungkin dapat menggunakan string ini untuk mengekstrak zona waktu, bukan?

Hai, saya lihat di atas bahwa format ('z') sudah usang. juga di saat docs, saya melihat itu sudah usang dari 1.6.0. Saya menggunakan 2.11.0 sekarang, saya dapat menggunakan 'z' untuk menampilkan zona waktu (PST / PDT) berdasarkan offset.
Haruskah saya tidak menggunakan 'z' ini dalam kode saya sekarang? dapatkah Anda memberi tahu alternatif yang tepat untuk menampilkan PST daripada - / + 8

@themakshter - tidak, Anda tidak mendapatkan hasil yang sama di semua browser. OS, versi browser, dan bahasa sangat berperan - dan tidak ada persyaratan konsistensi dalam spesifikasi.

@ Shobana16 - Jika Anda melakukan moment().format('z') , itu akan selalu mengembalikan "" .

Jika Anda menggunakan zona waktu momen, dan melakukan sesuatu seperti moment.tz('America/Los_Angeles').format('z') , Anda akan mendapatkan respons yang valid.

z baik-baik saja dengan zona waktu-momen. Itu tidak melakukan apa-apa pada saat biasa.

Terima kasih atas komentarnya MJ. Ya saya menggunakan 'z' dengan zona waktu momen saja. Ok keren akan tetap kode saya dengan 'z'. !

Sekadar catatan untuk ditambahkan, mulai saat-zona waktu 0.5.0, Anda dapat _guess_ di zona waktu lokal, yang membuka pintu untuk:

var abbreviation = moment.tz(moment.tz.guess()).format('z');

Ini tidak masalah, tetapi ketahuilah bahwa:

  1. Itu hanya tebakan. Ini mungkin salah menebak.
  2. Jika tebakannya salah, masih ada kemungkinan singkatan tersebut benar, karena banyak zona waktu serupa akan menggunakan singkatan yang sama, seperti bagaimana Europe/Paris dan Europe/Berlin keduanya menggunakan CET dan CEST .
  3. Namun, tidak ada jaminan. Jika tebakannya salah, Anda mungkin menampilkan singkatan yang salah.

Kami juga dapat mempertimbangkan untuk mengadaptasi moment.js sedemikian rupa sehingga jika zona waktu-momen tersedia sehingga dapat mencoba melakukan ini secara otomatis untuk mengaktifkan kembali pemformat z . Padahal ini tidak terjadi saat ini.

var abbreviation = moment.tz(moment.tz.guess()).format('zz'); sepertinya tidak bekerja (dengan dua z s). Apakah saya hanya dapat mengambil "EDT" dan bukan "Waktu Musim Panas Bagian Timur"?

Terima kasih!

Ahhh, saya menemukan bahwa http://momentjs.com/timezone/docs/#/using -timezones / formatting / mengatakan: Untuk memberikan nama formulir yang panjang, Anda dapat mengganti moment.fn.zoneName dan menggunakan zz token.
[and much more...]
Terima kasih.

Namun ada satu hal yang membingungkan. Dalam versi saat ini (atau seperti yang dinyatakan "pada 1.6.0 ") tidak ada cara untuk menampilkan zona waktu tanpa menggunakan zona waktu-waktu yang terpisah. Tetapi ketika saya melakukan moment(...).toString() itu menunjukkan misalnya GMT pada akhirnya. Jadi apakah ini bug, atau satu solusi bertentangan dengan fungsionalitas lain?

Namun ada satu hal yang membingungkan. Dalam versi saat ini (atau seperti yang dinyatakan "pada 1.6.0 ") tidak ada cara untuk menampilkan zona waktu tanpa menggunakan zona waktu-waktu yang terpisah. Tetapi ketika saya melakukan moment(...).toString() itu menunjukkan misalnya GMT pada akhirnya. Jadi apakah ini bug, atau satu solusi bertentangan dengan fungsionalitas lain?

Saya pikir masalahnya adalah keandalan. Momen tidak dapat mengekstrak zona waktu yang benar dari objek tanggal lokal dengan andal sehingga tidak lagi mendukung z/zz dalam pemformatannya.

Dibahas di atas:
https://github.com/moment/moment/issues/162#issuecomment -4060027

Inilah yang berhasil bagi kami untuk mendapatkan teks "GMT" karena z sudah tidak digunakan lagi

const dateGenerated = moment("2020-05-20 08:15:25");
const localDateGenerated = dateGenerated.local().format('DD MMM YYYY hh:mm A') + ' ' + String(dateGenerated.local()._d).split(' ')[5];

Ini akan menghasilkan 20 May 2020 08:15 AM GMT+0300"

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

nikocraft picture nikocraft  ·  3Komentar

danieljsinclair picture danieljsinclair  ·  3Komentar

slavafomin picture slavafomin  ·  3Komentar

vbullinger picture vbullinger  ·  3Komentar

alvarotrigo picture alvarotrigo  ·  3Komentar