Moment: pemformatan durasi

Dibuat pada 5 Sep 2013  ·  118Komentar  ·  Sumber: moment/moment

Kami telah menyentuh ini sebelumnya di #463 dan #879 tetapi tidak pernah benar-benar membicarakannya secara langsung dalam edisinya sendiri.

Kami membutuhkan metode untuk memformat durasi yang serupa dengan cara kami memformat tanggal. Ini harus sesederhana:

moment.duration(x).format("H:mm:ss")

Perhatikan bahwa token pemformatan harus memiliki arti yang sedikit berbeda, karena kami mewakili durasi waktu yang telah berlalu, bukan waktu hari. Saya menyarankan yang berikut ini:

  • hh berarti "sisa jam setelah menghitung hari"
  • h akan menjadi bentuk satu digit dari hh
  • HH berarti "total seluruh jam"
  • H akan menjadi bentuk satu digit dari HH
  • HHH berarti "total jam termasuk desimal" - meskipun saat ini dapat dilakukan dengan duration.asHours() , jadi ini mungkin tidak diperlukan.

Pemformatan serupa akan berlaku untuk unit lain. Dalam konteks ini, satuan tertinggi adalah "hari", yang merupakan hari standar yang terdiri dari 24 jam standar. Tidak masuk akal untuk mengukur tahun atau bulan dengan ini karena masalah kalender.

Catatan, ini muncul baru-baru ini (lagi) di StackOverflow di this question . Pengguna sedang mencari sesuatu seperti duration.format("H:mm:ss") . Ini adalah solusinya:

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

Ini berhasil, tetapi terasa seperti peretasan. Ini harus dibangun.

New Feature Up-For-Grabs

Komentar yang paling membantu

Bukankah lebih baik untuk melakukannya?

moment.utc(total.asMilliseconds()).format("HH:mm:ss");

dari pada

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

Semua 118 komentar

+1

moment.duration(x).format("H:mm:ss") persis seperti yang saya harapkan, sebelum memahami bahwa itu tidak akan berhasil. Solusi yang disarankan oleh Matt bekerja dengan baik tetapi membandingkan dengan keanggunan hal-hal lain di saat itu pasti tampak hacky.

Bukankah lebih baik untuk melakukannya?

moment.utc(total.asMilliseconds()).format("HH:mm:ss");

dari pada

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

Code Bounty

@RobinvdVleuten - Masalah dengan menggunakan HH dalam formatter saat ini adalah bahwa ia mewakili jam _porsi_ tanggal dan waktu penuh. Ketika berhadapan dengan waktu _elapsed_, mungkin ada 24 jam atau lebih. Coba lewati 24 jam, dan Anda akan melihat bahwa itu disetel ulang ke nol.

Aku benar-benar memperhatikannya. Saya sekarang menggunakan milidetik yang dihitung untuk memformatnya, tetapi ini masih merupakan solusi peretasan.

Apakah menurut Anda hanya akan ada satu "tingkat" sisa yang mungkin--misalnya tidak ada cara untuk mengatakan "jam setelah menghitung bulan"? Saya pikir itu batasan yang sangat masuk akal, tetapi hanya untuk meludah sebentar, saya bisa membayangkan memberikan argumen "jangkar", seperti:

moment.duration(x).format("hh:mm:ss", "M");

Yang memberitahu kita bahwa jam harus modulo bulan. Jangkar adalah opsional dan akan default ke unit terbesar ditambah satu ukuran ke atas (dalam hal ini, hari). Demikian pula, ia dapat menggunakan string itu sendiri untuk menentukan bahwa menit adalah modulo jam dan detik modulo menit. Sedangkan jika Anda melakukan ini:

moment.duration(x).format("hh:ss");

... detik akan menjadi modulo jam.

Itu mungkin bukan ide yang bagus--itu tidak diselesaikan (ke mana harus berminggu-minggu dalam hierarki ini?) dan itu mungkin tidak perlu (orang tidak mungkin menginginkan lubang seperti itu). Tapi menyenangkan untuk dipikirkan.

Pada catatan yang lebih serius, bagaimana Anda akan menangani bulan vs menit dengan notasi huruf kecil/huruf besar ini?

Saya membayangkan bahwa hari akan menjadi ukuran unit maksimum, jadi bulan tidak akan masuk ke gambar. Pada dasarnya, ini adalah kebalikan dari bagaimana kami mengurai durasi yang berasal dari rentang waktu asp.net.

Masuk akal.

Saya telah membaca dokumen SCORM 2004 RTE (p77), dan saya menemukan bahwa untuk representasi interval waktu adalah sebagai berikut, saya pikir ini berasal dari standar,

secara teori saya dapat memberikan nilai seperti: P34H
dan parser harus menafsirkannya sebagai 1 hari dan 10 Jam

saya harap dapat memformat ouput dengan mempertimbangkan hal ini
seperti 'PHM'
dan formatter menafsirkannya sebagai total Jam tersisa menit?
saya ingin dapat memformat output seperti HH:MM

semoga info ini bermanfaat

interval waktu (detik, 10,2):Interval waktu (detik, 10, 2) menunjukkan bahwa nilai untuk
interval waktu elemen model data mewakili waktu yang telah berlalu dengan presisi 0,01
detik[1]. Ikatan notasi titik SCORM mendefinisikan format tertentu untuk a
characterstring untuk mewakili interval waktu.
Format karakter string harus sebagai berikut:
P[yY][mM][dD][T[hH][nM][s[.s]S]] di mana:
• y: Jumlah tahun (bilangan bulat, >= 0, tidak dibatasi)
• m: Jumlah bulan (bilangan bulat, >=0, tidak dibatasi)
• d: Jumlah hari (bilangan bulat, >=0, tidak dibatasi)
• h: Jumlah jam (bilangan bulat, >=0, tidak dibatasi)
• n: Jumlah menit (bilangan bulat, >=0, tidak dibatasi)
• s: Jumlah detik atau pecahan detik (nyata atau bilangan bulat, >=0, bukan
terbatas). Jika pecahan detik digunakan, SCORM selanjutnya membatasi string ke
maksimal 2 digit (mis. 34.45 – valid, 34.45454545 – tidak valid).
• Penanda literal karakter P, Y, M, D, T, H, Mand S akan muncul jika
nilai bukan nol yang sesuai hadir.
• Nol-padding dari nilai-nilai harus didukung. Nol-padding tidak mengubah
nilai integer dari angka yang diwakili oleh satu set karakter. Untuk
contoh, PT05H setara dengan PT5H dan PT000005H.
Contoh:
• P1Y3M2DT3H menunjukkan jangka waktu 1 tahun, 3 bulan, 2 hari dan 3 jam
• PT3H5M menunjukkan jangka waktu 3 jam dan 5 menit

Pelaksana harus menyadari bahwa format dan pengikatannya adalah untuk komunikasi
data antara SCO dan LMS. Karena format mewakili periode waktu,
maka durasi seperti PT5M setara dengan PT300S.
Jika elemen model data bertipe timeinterval(second,10,2) berisi nilai, maka
• Penunjuk harus hadir;
• Jika nilai tahun, bulan, hari, jam, menit atau detik adalah nol, nilainya
dan penunjukan karakter literal yang sesuai dapat dihilangkan, tetapi setidaknya satu
penanda dan nilai literal karakter harus ada di samping penanda
P;
• Penanda harus dihilangkan jika semua komponen waktu (jam, menit)
dan detik) tidak digunakan. Nilai nol dapat digunakan kapan saja
komponen (misalnya, PT0S).

Pemformatan durasi akan menjadi tambahan yang bagus. Tidak perlu dua token "jam" yang berbeda. Asumsikan durasi 32 jam. Anda tidak akan pernah ingin mengekstrak hanya 8 jam tanpa juga mengekstraksi 1 hari.

Saya pikir @icambron punya saran bagus. Parsing string format menjadi token dan nyatakan durasinya dalam satuan terbesar. Parsing token satu per satu secara berurutan (misalnya, "DD:hh:dd" yang berarti jumlah hari lengkap, jumlah jam lengkap setelah menghitung hari, jumlah detik lengkap setelah menghitung hari + jam).

Saya telah memposting plugin moment.duration.format:
https://github.com/jsmreese/moment-duration-format

Saya pikir ini membahas sebagian besar ide/kasus penggunaan di utas ini.

@jsmreese Sudahkah Anda mempertimbangkan untuk mengajukan permintaan tarik yang berisi plugin Anda sebagai bagian inti dari momentjs?

@hotzenklotz Ya, saya telah mempertimbangkan untuk mengajukan permintaan tarik.

Saya belum melakukannya karena semua alasan @icambron diletakkan di #1538.

Plugin saya:

  • tergantung pada Lo-Dash
  • tidak terlihat dan terasa seperti kode Moment.js
  • menggunakan pengaturan pengujian yang sama sekali berbeda

Saya ingin _love_ plugin saya menjadi bagian dari inti Moment.js... tapi saya tidak akan membuang waktu mereka dengan permintaan tarik sebelum masalah tersebut diatasi.

Kami juga ingin memastikan bahwa kode tersebut dapat diinternasionalkan. Untungnya, sebagian besar string yang kita perlukan ada di Unicode CLDR, jadi sangat sedikit pekerjaan terjemahan yang diperlukan.

CLDR juga memiliki rekomendasi khusus lokal tentang cara memformat jenis interval tertentu, yang berpotensi lebih berguna daripada format durasi arbitrer. Tidak yakin bagaimana itu cocok di sini, tetapi mungkin menyenangkan untuk secara otomatis dapat menampilkan interval khusus lokal antara dua waktu tertentu.

CLDR juga memiliki informasi tentang cara menampilkan interval waktu tertentu (bukan durasi) yang dapat berguna di beberapa titik...

Data Kalender Inggris(AS)

Baru saja menerbitkan versi baru Format Durasi Momen yang menghilangkan ketergantungan sebelumnya pada Lo-Dash atau Garis Bawah.

https://github.com/jsmreese/moment-duration-format

@jsmreese Sesuai dengan kebutuhan kita dengan sempurna. Terima kasih!

+1

+1

+1

+1

+1

+1

+1

+1

Saya mungkin terdengar seperti rekaman rusak dalam masalah ini, tetapi saya ingin memastikan bahwa solusi apa pun mengikuti konvensi yang ada sedapat mungkin, dan dapat dengan mudah diinternasionalkan (termasuk menambahkan simbol yang mirip dengan LLLL untuk format durasi yang umum digunakan .

Agak mengganggu, CLDR tidak memberikan banyak pedoman khusus untuk durasi format, meskipun ada durasi relatif luas dan pedoman interval yang dapat berguna untuk saat di tempat lain. Namun, mereka memberikan beberapa panduan dan terjemahan minimal untuk unit durasi , yang memungkinkan Anda untuk menggabungkan unit yang relevan saat menerapkan sesuatu seperti humanize() .

Sintaks hh / h yang dijelaskan di atas terasa seperti penyimpangan yang signifikan dari token pemformatan yang digunakan oleh ISO8601, CLDR, dan Apache , dan saya lebih suka menghindarinya jika memungkinkan.

Proposal yang lebih baik mungkin adalah menyimpulkan untuk menggunakan unit yang paling signifikan dalam pola pemformatan sebagai modulo, jadi h:mm:ss akan menampilkan waktu "normal", tetapi hitung jam setelah 24 (misalnya 26:30:00). Tidak jelas bagaimana orang akan menghitung pola seperti "HH:MM:ss" , atau apa kasus penggunaannya. Mengizinkan pengembang untuk mengesampingkan perilaku ini juga sepertinya dapat dengan mudah menjadi sumber bug.

Menjaga semangat "i18n di mana-mana," CLDR mendefinisikan format durasi untuk:

  • Jam + menit ( h:mm di EN-US)
  • Jam + menit + detik ( h:mm:ss di EN-US)
  • Menit + detik ( m:ss dalam EN-US)
    dan mungkin masuk akal untuk menyediakan konstanta khusus lokal (mirip dengan format tanggal LLL ) untuk jangka waktu ini.

Sayangnya, durasi pemformatan dengan unit yang lebih besar dari jam sangat sulit untuk diungkapkan melalui string pemformatan tunggal (berkat aturan pluralisasi yang perlu Anda pertimbangkan), dan saya tidak dapat menemukan perpustakaan _any_ dalam bahasa apa pun yang memungkinkan mudah, pemformatan ramah i18n dengan durasi lebih dari 24 jam. Hal terbaik yang dapat Anda lakukan adalah memperluas duration.humanize() untuk mengambil beberapa parameter tambahan, secara efektif menerapkan proposal asli di #463.

Singkatnya, mungkin bukan ide yang baik untuk mengimplementasikan duration.format() , karena saya melihat solusi potensial memiliki banyak jebakan. Taruhan terbaik Anda adalah meningkatkan duration.humanize() , atau menerapkan duration.format() yang diperkecil yang hanya memahami jam, menit, dan detik.

+1

Jika Anda memerlukan fungsi cepat untuk menambahkan bantalan:

function padWithZero(input, length) {
    // Cast input to string
    input = "" + input;

    let paddingSize = Math.max(0, length - input.length);
    return new Array(paddingSize > 0 ? paddingSize + 1 : 0).join("0") + input;
}

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

:+1:

:+1: momen terkejut tidak melakukan ini, biasanya itu tidak pernah mengecewakan saya!

+1 Saya telah menggunakan format durasi-momen, yang disebutkan di atas, tetapi tidak diinternasionalkan. Saya mencoba untuk menghasilkan hari dan saya mungkin membutuhkan bulan juga, yang benar-benar membutuhkan label.

Apakah ada kemajuan dengan masalah ini?

+1

+1

+1

+1

:+1:

+1
kok masih belum di core

+1 +1 +1 +1 +1

+1

+2

@jsmreese apakah plugin Anda mendukung i18n?

@rumeshwick : mungkin? Itu sangat tergantung pada bagaimana Anda melakukan i18n dan apa yang Anda harapkan dari plugin saya.

+1

Saya menemukan bahwa itu mungkin dengan cara peretasan seperti ini:

  var dur = moment.duration('PT90M');
  moment(dur._data).format('[it\'s] D [days and] h [hour]');

Ini menghasilkan:

"itu 1 hari dan 1 jam"

Anda tidak dapat, bagaimanapun, mencetak sesuatu seperti "itu 1 hari dan 90 Menit".
Untuk tujuan saya ini sudah cukup.
Itu tidak termasuk i18n tetapi dalam kasus saya, saya tidak ingin ini diselesaikan oleh moment.js.

Hai, minta bantuan Ember.JS di sini untuk ini:

https://github.com/ember-building-blocks/ember-hbs-date-helpers

+1

+1 untuk cara hacky @vanthome :+1:

@jsmreese - apakah Anda tertarik untuk menggabungkan plugin Anda ke inti momen? Ini akan sangat berguna, dan sangat dihargai.

Itu perlu diformat ulang agar sesuai dengan implementasi ES6 yang baru, dan beberapa fungsi redundan diganti dengan setara momen, tetapi secara keseluruhan saya pikir itu akan cukup mudah.

@mj1856 pasti tertarik. Saya akan ping Anda melalui email dengan beberapa pertanyaan.

Ya! Bagus sekali, @jsmreese dan @mj1856!!! :tepuk tepuk tepuk:

Saya datang ke sini hanya untuk mengusulkan untuk menggabungkan plugin @jsmreese ke moment js.

+1

+1

Karena sepertinya @jsmreese kekurangan waktu, saya menandai ini sebagai Siap Diambil. Pada dasarnya, PR yang diusulkan harus mengimplementasikan semua fungsi plugin format durasi-saat @jsmreese , tetapi harus sesuai dengan gaya ES2015 yang sekarang digunakan di moment.js, dan harus menggunakan kembali sebanyak mungkin momen yang ada. fungsi js untuk meminimalkan ukuran kode.

+1

Salah satu fitur yang tidak dimiliki plugin format durasi momen @jsmreese , adalah kemampuan untuk membangun kembali objek durasi dari string yang diformat.

hei @ mj1856 , saya tertarik untuk menangani integrasi plugin format ke momen. bagaimana kontribusi bekerja di sini dengan label Up-For-Grabs , haruskah saya mengerjakannya dan mengirimkan PR ke cabang develop , atau adakah orang lain yang mengklaimnya?

@joshrowley itu tidak diklaim, tetapi Anda akan menjadi pahlawan jika Anda menyelesaikannya. Silakan dan ambil, dan ketika Anda siap, ajukan tarikan. Yang ini akan sedikit lebih sulit daripada yang lain untuk diperebutkan, jadi jika Anda mau, silakan ajukan permintaan tarik untuk ditinjau sebelum Anda selesai - kami akan mengawasinya. Kami akan pilih-pilih tentang tidak meledakkan ukuran perpustakaan dengan yang ini - itu sudah lebih besar dari yang kami inginkan. Harap berhati-hati akan hal itu.

Mungkin saya akan menangani ini juga (atau sebaliknya), tetapi pertama-tama harus menyesuaikan diri dengan struktur dev seluruh momen.

Pekerjaan sedang berlangsung PR: #3308

Hai teman-teman, saya membuka PR di # 3615 dan akan senang melihatnya!

mungkin ini terkait - masalah yang dihadapi:
moment.duration(3500000).format("hh:mm", { forceLength: true })
yang menampilkan hasil: 58, bukan 00:58

http://stackoverflow.com/questions/41443233/using-moment-js-to-display-duration-in-format-00xx-when-duration-is-less-than-a

ms = moment(moment().format(),"YYYY-MM-DD HH:mm:ss").diff(moment(time,"YYYY-MM-DD HH:mm:ss"));
var duration = moment.duration(ms);
moment(duration._data).format("HH:mm");

Namun peretasan lain untuk memformat durasi ....

var timeInSeconds = 5000;
var formattedDur = moment("1900-01-01 00:00:00").add(timeInSeconds, 'seconds').format("HH:mm:ss");

+1

Perhatikan bahwa peretasan yang diposting oleh @fabiogalera dan @befreestudios tampaknya berfungsi dengan baik untuk durasi <24 jam, tetapi tidak berfungsi untuk durasi lebih dari 24 jam.

EDIT: Ini tampaknya karena berada pada versi momen yang lebih lama. Saya baru saja mencobanya lagi dengan versi terbaru dan berfungsi seperti yang diharapkan. Maaf bila membingungkan.
-
Saya juga telah menemukan beberapa kesalahan pembulatan aneh/kasus tepi dengan peretasan asli yang diposting oleh @ mj1856 di bagian atas utas ini. Misalnya, coba 2,3 atau 4,1 jam. Itu adalah nilai desimal yang harus dibagi secara merata menjadi beberapa menit.

Misalnya, 2.3 harus tepat 2:18:00 tetapi Anda akan mendapatkan 2:17:59. Dan 4.1 seharusnya tepat 4:06:00, tetapi Anda akan mendapatkan 4:05:59. Ini tampaknya karena metode duration.asXXX() memiliki beberapa masalah presisi/pembulatan. Adakah orang lain yang melihat ini dan punya saran?

Inilah fungsi saya untuk durasi.format berdasarkan Date.format (https://Gist.github.com/ptquang86/2893903)

moment.duration.fn.format = moment.duration.fn.format || function (mask): string {
            // Some common format strings
            let formatMasks = {
                "default":      "DD MM YYYY HH:mm:ss",
                shortDate:      "M/D/YY",
                mediumDate:     "MM DD, YYYY",
                longDate:       "MM DD, YYYY",
                fullDate:       "DD, MM, YYYY",
                shortTime:      "H:mm TT",
                mediumTime:     "H:mm:ss TT",
                longTime:       "H:mm:ss TT Z",
                isoDate:        "YYYY-MM-DD",
                isoTime:        "hh:mm:ss",
                isoDateTime:    "YYYY-MM-DD'T'hh:mm:ss",
            };

            let format = function () {
                let token = /D{1,2}|M{1,2}|YY(?:YY)?|([HhmsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g;

                function pad(val, len?) {
                    val = String(val);
                    len = len || 2;
                    while (val.length < len) val = "0" + val;
                    return val;
                }

                // Regexes and supporting functions are cached through closure
                return function (date, mask) {
                    mask = String(formatMasks[mask] || mask || formatMasks["default"]);

                    let D = date.days(),
                        m = date.months(),
                        y = date.years(),
                        H = date.hours(),
                        M = date.minutes(),
                        s = date.seconds(),
                        L = date.milliseconds(),
                        flags = {
                            D:    D,
                            DD:   pad(D),
                            M:    m + 1,
                            MM:   pad(m + 1),
                            YY:   String(y).slice(2),
                            YYYY: y,
                            H:    H % 12 || 12,
                            HH:   pad(H % 12 || 12),
                            h:    H,
                            hh:   pad(H),
                            m:    M,
                            mm:   pad(M),
                            s:    s,
                            ss:   pad(s),
                            l:    pad(L, 3),
                            L:    pad(L > 99 ? Math.round(L / 10) : L),
                            t:    H < 12 ? "a"  : "p",
                            tt:   H < 12 ? "am" : "pm",
                            T:    H < 12 ? "A"  : "P",
                            TT:   H < 12 ? "AM" : "PM",
                        };

                    return mask.replace(token, function ($0) {
                        return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
                    });
                };
            }();

            return format(this, mask);
        };

gunakan: moment.duration(10000).format("hh:mm:dd:l")

+1

Ada berita di sini, akankah saat mendapatkan fungsi ini? Apa konsensusnya?

+1

Menabrak lagi seperti proyek ke-4 di mana saya ingin menggunakan fungsi seperti itu. Saya berharap untuk melihatnya diimplementasikan di moment.js segera.

+1

Saya telah mengawasi ini untuk waktu yang lama dengan harapan bahwa fitur ini akan diimplementasikan. Apakah ada pekerjaan yang sedang berlangsung dalam hal ini?

Sejauh yang saya tahu itu berfungsi sekarang, saya memilikinya di aplikasi saya, periksa dokumen:
https://momentjs.com/docs/#/durations/

@ luchillo17 Apakah Anda berbicara tentang durasi, secara umum, berfungsi?

Yah saya baru saja mencoba 5 menit yang lalu dan itu berhasil.

Yah, hanya ingin menjadi jelas tentang apa yang kita bicarakan di sini. Durasi _do_ bekerja. Masalah ini adalah tentang pemformatan durasi.

Sayang sekali, utasnya begitu besar sehingga saya tersesat di jalan.

Namun sekarang saya melihat lebih dekat ada plugin untuk pemformatan durasi momen yang tercantum dalam dokumen:
https://momentjs.com/docs/#/plugins/duration -format/

Apakah itu yang kalian harapkan? sepertinya bahkan memiliki definisi tipe TypeScript.

Dan saya sudah mengujinya, bekerja dengan cukup baik.

Plugin bekerja dengan sangat baik. Akan senang melihatnya digabung menjadi Moment.js. Saya tidak bisa melihat bagaimana durasi berguna tanpanya.

Ini adalah plugin karena tidak semua orang menggunakan durasi, saya tidak melihat banyak basis pengguna yang membutuhkan durasi untuk membenarkan membuat basis kode lebih besar.

Saya bahkan terkejut seluruh modul durasi tidak ada dalam sebuah plugin.

Atau itu. Saat ini, modul durasi tidak ada gunanya bagi saya. Semua fungsi di dalamnya hanyalah matematika sederhana yang dapat dilakukan dengan baik tanpa perpustakaan.
Jika plugin digabung, maka saya dapat melihatnya memiliki kegunaan yang baik.

Mungkin, tetapi tidak berpikir bahwa matematika adalah gunanya perpustakaan, solusi yang diuji pertempuran sehingga Anda dan saya tidak perlu membuang waktu untuk tugas-tugas seperti itu, seperti misalnya saya tidak tahu ada begitu banyak standar untuk durasi, seperti ISO 8601, modul durasi menanganinya untuk saya jadi saya tidak perlu tahu bagaimana standar itu didefinisikan.

Saya rasa begitu.
Either way, saya mengusulkan kami referensi plugin dalam dokumentasi.
Dengan begitu, orang tahu fungsinya ada di sana, dan tidak perlu membuka Google dan mencari fungsi ini.

Memang, saya butuh beberapa saat untuk mengetahui bagian plugin untuk itu.

4 tahun dan masih tidak ada reaksi dari pemilik... Menyedihkan :(

Hai teman-teman,

Ini adalah sesuatu yang masih kami kerjakan. Momen adalah komunitas sukarelawan! Kita perlu memastikan fitur seperti ini memiliki properti berikut:
1) bekerja di setiap lingkungan
2) tidak menambahkan terlalu banyak massal ke kode
3) tidak menemukan kembali roda (yaitu sudah ada plugin untuk melakukan ini!)
4) tidak merusak fitur yang ada

Mungkin saja ini akan bergabung di beberapa titik.
https://github.com/moment/moment/pull/3615

Jika menurut Anda dokumen lebih baik menunjukkan plugin pemformatan durasi (atau plugin lain!), Silakan kirim PR dengan cara kami di sini: https://github.com/moment/momentjs.com/

@marwahaha

tidak menambahkan terlalu banyak massal ke kode
tidak menemukan kembali roda (yaitu sudah ada plugin untuk melakukan ini!)

Nah, karena sudah ada plugin format durasi dan durasi di dalam perpustakaan momen, mungkin solusi terbaik adalah mengambil durasi dari moment.js ke dalam plugin terpisah dan kemudian mengimplementasikan semua hal "berat" di dalam plugin itu?
Dengan demikian 2 tujuan akan tercapai:
1) kurangi ukuran moment.js
2) memberikan durasi secara langsung dengan fitur yang paling berguna daripada versi yang sangat terbatas.

Salah satu tantangan besar adalah bahwa pemformatan durasi akan sangat sulit untuk diterapkan di seluruh cakupan lokal yang didukung oleh moment.js.

Saya tidak suka melihat lokal tersebut kehilangan dukungan durasi terbatas yang mereka miliki saat ini, atau Momen menambahkan fitur yang hanya berfungsi dengan benar di beberapa lokal. Menjaga pemformatan durasi dalam sebuah plugin sepertinya merupakan jalan tengah yang baik yang memastikan bahwa "inti" dari moment.js stabil, dan berfungsi untuk semua orang, sambil memberikan opsi kepada pengguna lokal tunggal untuk menggunakan plugin yang menjalankan fungsi khusus untuk lokal mereka .

Plugin pemformatan durasi sudah ada dan dirujuk di dalam dokumentasi. Itu lebih dari cukup.

@OogieBoogieInJSON Yah, dokumennya tidak terlalu membantu, pada dasarnya saya harus memeriksa masalah ini bahkan sebelum mendapatkan plugin di dokumen, ada sedikit paparan fitur-fitur itu kecuali Anda benar-benar mencoba dan membaca seluruh dokumen, yang memang tidak ada yang melakukannya.

@ luchillo17 Saya membaca semua dokumen sebelum bekerja dengan apa pun. Mungkin, itu hanya saya.

Haha, ya, itu bagus bahwa Anda melakukannya, semua orang harus melakukannya, tetapi kebanyakan dari kita sebagai pengembang memiliki jadwal untuk bertemu, jadi memahami setiap mur & baut dari semua lib yang kita gunakan tidak praktis.

@ luchillo17 Bukan salah dokumentasi Anda melakukan Pemrograman Berorientasi Manajemen. Bersulang!

Bagi mereka yang mengikuti kisah pemformatan durasi momen, saya telah menerbitkan versi 2.0.0 dari plugin format durasi momen saya.

Versi baru menyelesaikan/menggabungkan hampir semua masalah dan umpan balik dari empat tahun terakhir versi 1 telah beredar -- termasuk lokalisasi dan dukungan pluralisasi serta beberapa opsi pemformatan yang berguna.

Lihat di sini: https://github.com/jsmreese/moment-duration-format/releases

MVP asli -> @jsmreese

Hah. Terima kasih atas kata-kata yang baik, @OogieBoogieInJSON.

Mau tak mau saya perhatikan bahwa plugin saya berdiri di atas -- dan tidak akan ada tanpa -- upaya besar pembuat dan pengelola momen, belum lagi banyak, banyak kontributor. Saya meluangkan waktu sekarang untuk meninjau kembali sesuatu yang saya buat empat tahun lalu (wow, apakah itu benar-benar lama!) terus terang artinya jika dibandingkan dengan penggembalaan berkelanjutan mereka dari proyek ini!

Aaaaaa dan versi 2.1.0 diterbitkan.
https://github.com/jsmreese/moment-duration-format/releases

Versi yang diperbarui memperbaiki beberapa masalah dari versi 2.0, dan memperkenalkan moment.duration.format , fungsi baru untuk pemformatan terkoordinasi dari beberapa durasi. Jangan bingung dengan moment.duration.fn.format yang sudah ada.

Fungsi baru mengambil larik durasi, dan mengembalikan larik string yang diformat, dan berguna kapan pun Anda memiliki grup durasi yang harus diformat bersama secara konsisten.

moment.duration.format([
    moment.duration(1, "second"),
    moment.duration(1, "minute"),
    moment.duration(1, "hour")
], "d [days] hh:mm:ss");
// ["0:00:01", "0:01:00", "1:00:00"]

moment.duration.format([
    moment.duration(1, "minute"),
    moment.duration(1, "day")
], "w [weeks], d [days], h [hours], m [minutes], s [seconds]", { trim: "all" });
// ["0 days, 1 minute", "1 day, 0 minutes"]

@jsmreese 2.0 memang menyebabkan beberapa kesalahan sebelumnya jadi saya harus menguncinya ke 1.3.0 untuk keamanan, namun terima kasih telah menjaga fitur/proyek tetap hidup.

@prusswan tolong coba versi 2.1.0. Saya ingin tahu apakah Anda masih melihat kesalahan itu!

Saya telah menerbitkan versi 2.2.0 format durasi-waktu, yang sekarang menyertakan fungsi format angka mundur karena toLocaleString tidak sepenuhnya diterapkan di banyak lingkungan.

https://github.com/jsmreese/moment-duration-format/releases

Saya telah menguji versi baru menggunakan BrowserStack pada berbagai perangkat Android dengan versi OS dari 2.2 hingga 7, dan pada berbagai perangkat iOS dengan versi OS dari 4.3 hingga 11. Juga diuji pada Chrome, Firefox, IE 8-11, dan browser Edge.

@prusswan dan orang lain yang harus mengunci versi ke 1.3.0 , Anda mungkin akan menemukan bahwa versi 2.2.0 akhirnya pengganti drop-in yang seharusnya versi 2.0.0.

Terima kasih kepada semua yang telah mencatat masalah terhadap versi 2 dari plugin ini!

Setelah mengimplementasikan versi 2 dari plugin format durasi-waktu, ada beberapa peningkatan yang jelas untuk versi 3.

Saya telah mencantumkan ide-ide saya di bawah ini dan menambahkannya sebagai masalah di repositori . Jika Anda memiliki ide atau komentar tentang apa yang ingin Anda lihat, beri tahu saya!

Semoga versi berikutnya akan diterbitkan dalam waktu sekitar 4 bulan ... bukan 4 tahun menunggu versi 2.

  • Opsi pelokalan pemformatan nomor mundur harus disertakan dengan ekstensi objek Lokal Momen yang telah saya buat untuk pelokalan label unit durasi. Ini akan menempatkan semua konfigurasi lokalisasi di satu tempat.

  • format-durasi-saat dan fungsi pemformatan nomor cadangannya tidak mengikuti API yang sama dengan Number#toLocaleString untuk digit signifikan dan digit faksi. Fungsi fallback harus diperbarui untuk menggunakan toLocaleString API, dan plugin harus mengekspos opsi toLocaleString API secara langsung daripada menyembunyikan beberapa opsi dan menutupinya di belakang precision dan useSignificantDigits opsi.

  • Mengekspos fungsi pemformatan nomor cadangan serta fungsi pengujian fitur toLocaleString akan memfasilitasi pengujian dan memungkinkannya digunakan di luar konteks durasi pemformatan.

  • Tambahkan definisi tipe untuk mendukung TypeScript, publikasikan paket NuGet, dan dukung opsi pengemasan lain apa pun yang digunakan saat ini. (Ini tidak harus menunggu hingga versi 3.)

  • Pengujian plugin harus dimodernisasi, idealnya agar sesuai dengan pengaturan pengujian Moment.js. (Ini juga tidak harus menunggu hingga versi 3.)

@jsmreese Pekerjaan yang luar biasa, tetapi sama sekali tidak merasa tertekan untuk menabrak versi utama dua kali dalam waktu singkat. Jika masih digunakan setelah 4 tahun tanpa pembaruan, maka mungkin sebagian besar sudah cukup baik. Saya merasa masalah saat ini dapat ditutup karena sudah ada resolusi (gunakan plugin). Masalah baru dapat dimulai untuk memutuskan apakah fungsi ini harus menjadi bagian dari momen itu sendiri.

@jsmreese Luar Biasa. Terima kasih banyak dan tepat waktu! Kesepakatan besar bagi saya dan terima kasih untuk semua yang Anda lakukan.

Lihat https://momentjs.com/docs/#/ -project-status/

Terima kasih untuk semua diskusi di sini.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat