Moment: Cari indikator meridiem saat mencocokkan format iso

Dibuat pada 23 Feb 2016  ·  15Komentar  ·  Sumber: moment/moment

Seperti yang disajikan di #2983, menggunakan format tanggal "23-02-2016 11:31:23 PM" akan cocok dengan format ISO, meskipun tidak. Ini menyebabkan tanggal yang salah diuraikan:

moment('2016-02-23 11:31:23 PM').format() = "2016-02-23T11:31:23-06:00"

Ini karena 23-02-2016 11:31:23 secara teknis adalah format ISO.
Kita perlu mengubah file from-string untuk memeriksa indikator meridiem dan melakukan sesuatu selain mencocokkan format ISO jika ada.

Bug Forgiving parsing

Semua 15 komentar

Aduh! Yang itu sepertinya pasti akan menggigit seseorang. Tidak ada peringatan penghentian juga.

Sepertinya mungkin hanya memastikan pemeriksa ISO berjalan sampai ke akhir string sudah cukup, misalnya dengan menambahkan $ ke akhir extendedIsoRegex dan basicIsoRegex .

@icambron Saya tidak berpikir kita bisa melakukan itu. Saat ini tes berikut lulus:

    assert.ok(moment('2016-01-01 is my date').isValid(), 'test extra chars after iso date')

Hampir pasti ada seseorang di dunia yang melakukan itu. Ubah regex dan tes itu gagal (bersama dengan beberapa lainnya yang belum saya buru).

Hmm baiklah. Pendapat saya adalah mencela itu dan memperbaiki hal AM/PM ini ketika kami menghentikan dukungan untuk itu. Saya tidak melihat alasan bagus mengapa kita _harus_ mendukung moment('2016-01-01 is my date')

Saya telah memikirkan hal ini sedikit, dan saya agak bertanya-tanya apakah jawaban paling tidak invasif untuk beberapa masalah parser yang kami lihat - seperti ini - adalah dengan benar-benar mengatur parser ke mode ketat. Sepertinya lebih sering daripada tidak, memaafkan masalah penguraian (seperti ini) diselesaikan dengan beralih ke mode ketat (karena pengguna seharusnya menggunakan mode ketat sejak awal). Mungkin ini adalah salah satu dari 'membantu orang jatuh ke dalam lubang kesuksesan'? Itu akan memungkinkan fungsionalitas yang ada, tetapi dorong dev ke jalur yang benar.

Setuju, kami sudah lama ingin melakukan itu. Saya pikir itu sudah terdaftar sebagai item 3.0 yang mungkin untuk waktu yang lama. Tapi tentu saja memiliki automagic one-arg signature yang ketat adalah langkah kecil menuju itu.

Saya sebenarnya mulai mengkodekan mode-ketat-by-default hari ini dengan menambahkan variabel status global yang dapat diaktifkan yang disebut globalStrict, yang saya defaultkan ke true. Pengaturan mode ketat kemudian dapat dialihkan kembali ke false dengan memanggil:

moment.globalStrict(false)

Ini membuat semuanya berperilaku seperti biasanya, tanpa harus mengubah setiap panggilan ke pengurai momen.
Dibutuhkan sekitar empat baris kode untuk membuat perubahan ini - dan kemudian seseorang harus memperbaiki ratusan unit test :-)
Bagi saya, ini mungkin cara untuk meluncurkan secara default tanpa harus menunggu v3.
Saya merasa karena pengguna dapat dengan mudah mengubahnya kembali, mereka mungkin menerima perubahan tanpa terlalu banyak mengeluh.

Sebagai alternatif, pengaturan globalStrict dapat default ke false, dan kami sangat menganjurkan pengembang untuk menyetelnya ke true dalam dokumentasi. Ini kurang invasif dan mungkin membantu?
Saya akan menjadi orang pertama yang mengatakan bahwa variabel keadaan global SUCK dari sudut pandang testability, dan untuk alasan itu saja ide ini mungkin mengerikan.

Saya juga bisa, seperti yang disarankan, hanya panggilan satu argumen default ke mode ketat. Itu akan mengecewakan ribuan orang yang mungkin masih jatuh kembali ke konstruksi tanggal JS.

Saya suka semua itu, kecuali satu hal:

Itu akan mengecewakan ribuan orang yang mungkin masih jatuh kembali ke konstruksi tanggal JS.

Untuk lebih jelasnya, saran saya bukan untuk menyelesaikan penghentian konstruktor tidak bisa-jatuh-kembali-ke-JS. Faktanya, sebaliknya: dalam hal ini, kami ingin melakukan hal itu tetapi pemeriksaan ISO mendahului kami.

Jadi, apakah Anda mengatakan Anda akan mencoba hal negara global, atau bahwa Anda akan menghindarinya? Mungkin saya akan menyelesaikan unit test dan membuat PR dan kita bisa membicarakannya di sana.

Maaf, saya tidak jelas: Saya sama sekali tidak menentang negara global. Saya hanya tidak berpikir itu menghalangi kita untuk membuat pemeriksaan ISO moment(string) ketat sepanjang waktu, bahkan tanpa set status.

@maggiepint terima kasih telah mengarahkan saya ke utas yang tepat.
dan Anda telah menyatakan dengan benar di atas bahwa saya adalah "salah satu dari orang-orang di luar sana" :P melakukan hal-hal seperti
moment("2016-04-06Tnull").isValid()
dengan keyakinan penuh saat itu akan menolak string yang tidak valid.

Jadi apa cara termudah untuk mengaktifkan penguraian ketat secara default? (maaf, malas)

@Aukhan kami tidak pernah menerapkan ketat global karena masalah penguraian mode ketat yang perlu diperbaiki terlebih dahulu. (tapi itu, jadi kita mungkin belum sampai di sana).

Untuk mencapai apa yang Anda lakukan, saya pikir Anda hanya perlu menentukan inline mode konstan dan ketat ISO_8601 dalam kode Anda:

moment("2016-04-06Tnull", moment.ISO_8601, true).isValid()
false

@maggiepint sekali lagi terima kasih atas balasan Anda ...

Itu saran yang bagus tetapi saya tidak ingin mengganti ratusan ekspresi seperti itu di mana bukan hanya ISO_8601 tetapi format khusus yang berbeda digunakan, jadi saya kira opsi ketat global akan menyenangkan untuk dimiliki.
Saya mulai melihat ke dalam basis kode, tetapi jelas pekerjaan besar dan hebat seperti itu tidak dapat dipahami dalam semalam.

Saya mungkin tidak memiliki keterampilan yang diperlukan tetapi jika saya dapat membantu dengan cara apa pun, beri tahu saya.
Terima kasih!

@Aukhan Saya akan melihat apakah saya tidak dapat mengambil item pekerjaan itu lagi. Masalahnya adalah untuk membuatnya bekerja, PR #3078 perlu digabung. Itulah mengapa benda itu dijatuhkan di tempat pertama.

Menutup mendukung #3502

Apakah halaman ini membantu?
0 / 5 - 0 peringkat