Moment: Dukungan untuk milidetik desimal

Dibuat pada 22 Jun 2016  ·  3Komentar  ·  Sumber: moment/moment

(ver 2.13.0)
Standar ISO memungkinkan sejumlah detik desimal sebelum 'Z' dalam string dateTime. Platform .net tampaknya menggunakan 7 tempat desimal - sedangkan perpustakaan moment.js hanya menguraikan 3 tempat desimal pertama.

Saya telah menambal monyet pemformat (toISOString()) untuk menarik 7 digit penuh dari objek pembuatan - tetapi ini adalah peretasan yang mengerikan. Menambal parser akan jauh lebih baik - tetapi di luar pemahaman saya saat ini.

Mungkin ada solusi lain?

Komentar yang paling membantu

Maggie,

Ah. I hadn't realised this was a limitation of Javascript.

I had found the option for formatting that you had mentioned - but

bagi saya, saya sangat membutuhkan angka ekstra itu. Nol tidak cukup baik.

My 'monkey patch' looks at the creationData for the moment and

secara manual mem-parsing milidetik dari string input (jika ya
tersedia).

//Monkey patch the moment library to use 7 decimal places for seconds in it's standard ISO format - to match C# moment.fn._oldToISOString = moment.fn.toISOString; moment.fn.toISOString = function () { try { var originalDateSplit = moment(this).creationData().input.split("."); var milliseconds = originalDateSplit[originalDateSplit.length - 1]; if (milliseconds.indexOf(this.milliseconds()) === 0) { return moment(this).format('YYYY-MM-DD[T]HH:mm:ss.') + milliseconds + "Z"; } else { return moment(this)._oldToISOString(); } } catch (error) { return moment(this)._oldToISOString(); } }
Itu tidak cantik - dan hanya akan berfungsi untuk saat-saat itu
awalnya diuraikan dari string tanggal ISO. Ini juga akan menjadi tidak konsisten
dengan fungsi milidetik(). Ide yang lebih baik adalah mencegat
proses parsing dan tarik detik desimal ke properti terpisah di
objek momen - maka kita dapat mengembalikannya sesuai kebutuhan.

However - I do appreciate that we are moving beyond the scope of the

perpustakaan moment.js pada saat ini - tidak lagi menjadi pembungkus untuk a
Objek Tanggal Javascript.

Perhaps we could make this limitation a little clear in the moment.js

dokumentasi? Saat ini pemotongan milidetik tersirat dari
kode contoh, tetapi tidak dijelaskan secara eksplisit - dan tidak ada penjelasan sebagai
mengapa ia berperilaku seperti ini.

Thank you for your help Maggie - it is much appreciated.

Salam,
Ben Hathaway
Pengembang perangkat lunak
DATUM - Pemantauan Geoteknik dan Struktural

Semua 3 komentar

Karena Moment.js adalah pembungkus untuk objek Date di JavaScript, kami dibatasi hingga tiga tempat desimal (milidetik). Ini karena hanya itu yang didukung oleh objek tanggal, jadi benar-benar tidak ada cara untuk menyimpan lebih banyak. Anda tidak perlu menambal monyet apa pun untuk mendapatkan tujuh tempat desimal untuk ditampilkan atau diuraikan. Ketahuilah bahwa hanya tiga yang pertama yang benar-benar akan digunakan.

moment('2016-01-01T05:21:22.1234567Z').format('YYYY-MM-DDTHH:mm:ss.SSSSSSS')
"2015-12-31T23:21:22.1230000"

Perhatikan bahwa output diisi nol, tetapi ada tujuh digit dua arah.

Maggie,

Ah. I hadn't realised this was a limitation of Javascript.

I had found the option for formatting that you had mentioned - but

bagi saya, saya sangat membutuhkan angka ekstra itu. Nol tidak cukup baik.

My 'monkey patch' looks at the creationData for the moment and

secara manual mem-parsing milidetik dari string input (jika ya
tersedia).

//Monkey patch the moment library to use 7 decimal places for seconds in it's standard ISO format - to match C# moment.fn._oldToISOString = moment.fn.toISOString; moment.fn.toISOString = function () { try { var originalDateSplit = moment(this).creationData().input.split("."); var milliseconds = originalDateSplit[originalDateSplit.length - 1]; if (milliseconds.indexOf(this.milliseconds()) === 0) { return moment(this).format('YYYY-MM-DD[T]HH:mm:ss.') + milliseconds + "Z"; } else { return moment(this)._oldToISOString(); } } catch (error) { return moment(this)._oldToISOString(); } }
Itu tidak cantik - dan hanya akan berfungsi untuk saat-saat itu
awalnya diuraikan dari string tanggal ISO. Ini juga akan menjadi tidak konsisten
dengan fungsi milidetik(). Ide yang lebih baik adalah mencegat
proses parsing dan tarik detik desimal ke properti terpisah di
objek momen - maka kita dapat mengembalikannya sesuai kebutuhan.

However - I do appreciate that we are moving beyond the scope of the

perpustakaan moment.js pada saat ini - tidak lagi menjadi pembungkus untuk a
Objek Tanggal Javascript.

Perhaps we could make this limitation a little clear in the moment.js

dokumentasi? Saat ini pemotongan milidetik tersirat dari
kode contoh, tetapi tidak dijelaskan secara eksplisit - dan tidak ada penjelasan sebagai
mengapa ia berperilaku seperti ini.

Thank you for your help Maggie - it is much appreciated.

Salam,
Ben Hathaway
Pengembang perangkat lunak
DATUM - Pemantauan Geoteknik dan Struktural

Hai @maggiepint ,

Saya mencari yang sama. Setelah debugging melalui moment.js , saya perhatikan itu memanggil fungsi zerofill .

Karena nilai yang dihasilkan adalah string, saya tidak mengerti mengapa nol mengisinya🤔🤔🤔
Misalnya, saya punya ini:

const value = 1596099230963;
const formatString = 'MM/DD/YYYY HH:mm:ss.SSSSSS';
const val = moment.utc(value).format(formatString);
console.log(val);

Ini mencetak 07/30/2020 08:53:50.963000 bukannya 07/30/2020 08:53:50.963939

Selanjutnya, saya perhatikan versi moment.js tidak melakukan pengisian nol ini, misalnya ver 2.5.

Saya harus menulis pemformat khusus sekarang untuk mempertahankan info yang benar pada tanggal kecuali perubahan dilakukan pada moment.js . Adakah kemungkinan kita bisa membuat perubahan ini?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat