Moment: Fitur durasi hilang

Dibuat pada 10 Okt 2012  ·  186Komentar  ·  Sumber: moment/moment

Saya sedang mengerjakan sebuah proyek dan momentjs sangat berguna untuk manipulasi tanggal jadi terima kasih untuk itu.

Sebagai contoh, kami sedang membuat semacam toko untuk tiket pesawat. Fungsi duration.humanize() adalah cara yang tidak tepat bagi kita.

Misalnya saat berangkat pukul: 12.00 dan mendarat pukul 13.30. Ini akan membulatkannya menjadi 2 jam. Tetapi kita membutuhkan semacam perincian yang hilang dari momenjs.

memanusiakan dapat default ke 1 tingkat presisi mulai dari nilai tertinggi.

// 1:30
duration.humanize()
2 hour
duration.humanize({precision: 2})
1 hour 30 minutes
duration.humanize({precision: 3})
1 hour 30 minutes 0 seconds

Masalah kedua adalah ketika ada angka 0. Momentjs menerjemahkannya sebagai "beberapa detik". Saya tidak begitu yakin bagaimana itu bisa dicapai tetapi akan menyenangkan memiliki semacam pemformatan.

// 3 days and 0 minutes
duration.format('D [and] M')
> 3 days and 0 minutes
duration.format('H [and] M')
> 72 hours and 0 minutes
duration.format('H [and] m')
> 72 hours and few minutes

Dengan begitu, nilai tertinggi dapat dipetakan dalam format. Jadi kalaupun ada 1 tahun, format tersebut memberitahu kita bagaimana menampilkannya dengan benar. Saya akan dengan senang hati mendorong komit untuk itu karena ini sangat berguna dan harus melakukannya dengan tangan ketika momen sudah menangani pelokalan terasa buruk.

New Feature

Komentar yang paling membantu

2019, masih membutuhkan fitur ini.

Semua 186 komentar

+1 atas permintaan ini

@llacix , apakah Anda tertarik untuk menulis permintaan tarik untuk ini?

Ya mungkin, saya akan mencoba mencari waktu untuk itu. Menambahkannya ke momentjs mungkin akan menghemat waktu saya dan orang lain dalam jangka panjang. Saat ini ini memaksa saya untuk membuat semacam kekacauan di mana-mana dan itu tidak sempurna. Memperbaiki momen tampaknya lebih tepat.

Tetapi kita mungkin harus membahas lebih banyak tentang format seperti apa yang harus dilakukan. Misalnya, harus 0 nilai ditampilkan atau tidak.

4 hours 20 seconds atau 0 days 4 hours 0 minutes 20 seconds

Bulan akan menjadi 30 hari, setahun 365.

Dan format apa selain tahun, bulan, minggu, hari, menit, detik dan milidetik yang harus ada.

1 untuk ini
Tapi ya, pemformatan adalah masalah utama di sini. Manusiawi dan format sama-sama dibutuhkan.
Beberapa saran untuk memanusiakan perilaku:
// 1:30
durasi.humanize ();
1 jam 30 menit
durasi.humanize ({round: "hours"})
2 jam
durasi.humanize ({round: "minutes"})
1 jam 30 menit
durasi.humanize ({round: "seconds"})
1 jam 30 menit 0 detik

Jika putaran tidak didefinisikan secara eksplisit, saya pikir kesatuan tertinggi yang nilainya nol dan semua unit yang lebih kecil dari itu harus dihilangkan.

// 1 jam 0 menit 45 detik
durasi.humanize () -> 1 jam
// 1 jam 1 menit 0 detik
durasi.humanize () -> 1 jam dan 1 menit
// 1 jam 1 menit 10 detik
durasi.humanize () -> 1 jam 1 menit dan 10 detik

Selain itu, pemisah "dan" harus digunakan untuk gabungan terakhir, diawali dengan spasi
2 bulan 6 hari 7 jam 36 menit

Ini adalah bagaimana saya membayangkan bahwa fungsi tersebut harus berperilaku secara default

Berikut saran saya untuk penandatanganan dan implementasinya.

var duration = moment.duration({
    hours : 1,
    minutes : 0,
    seconds : 20,
    milliseconds : 0
});
duration.countdown(); // 1 hour 0 minutes 20 seconds
duration.countdown(1); // 1 hour
duration.countdown(2); // 1 hour and 0 minutes
duration.countdown(3); // 1 hour 0 minutes and 20 seconds

Seperti yang disarankan @sylvainpolletvillard , kita mungkin ingin menambahkan parameter untuk memotong nilai nol. Mungkin seperti ini.

duration.countdown(3); // 1 hour 0 minutes and 1 second
duration.countdown(3, true); // 1 hour

Kami mungkin juga ingin menambahkan parameter untuk sufiks seperti moment.fromNow(Boolean) .

duration.countdown(3); // 1 hour 0 minutes and 1 second ago
duration.countdown(3, null, true); // 1 hour ago

Kita dapat membangun ini dengan mudah untuk bahasa Inggris, tetapi menggabungkan semua string ini dengan benar dalam semua bahasa yang berbeda akan sangat rumit.

Kita mungkin harus membuat callback untuk bahasa untuk menggabungkan string itu sendiri. Aturan ini mungkin akan sangat rumit (saya melihat Anda, Hongaria ).

Saya pikir cara terbaik untuk menyampaikan nilai-nilai ini adalah seperti berikut ini.

var keys    = [     "h",        "mm",          "s"],
    values  = [       1,           0,           20],
    strings = ["1 hour", "0 minutes", "20 seconds"];

lang.countdown(keys, values, strings, addSuffix);

Maka terjemahan bahasa Inggrisnya akan menjadi seperti ini:

lang.countdown = function (keys, values, strings, addSuffix) {
    var i, output = "";

    for (i = 0; i < strings.length; i++) {
        if (i === strings.length - 1 && strings.length > 1) {
            output += "and ";
        }
        output += strings[i] + " ";
    }
    if (addSuffix) {
        output += "ago";
    }
}

Secara keseluruhan, ini menjadi tambahan yang sangat kompleks yang akan membutuhkan 33 fungsi terjemahan dan lebih banyak kode di inti. Juga, saya tidak yakin seberapa sering itu akan digunakan, jadi itu menambahkan semua yang membengkak untuk orang lain.

Mungkin ini akan lebih baik dipindahkan ke plugin?

Kembali ke diskusi tentang memformat durasi, saya pikir akan sangat bagus jika hal seperti ini memungkinkan -

moment.duration(9483000).format('d h m s') // 1 day 2 hours 20 minutes 30 seconds  
moment.duration(9483000).format('h m s') // 26 hours 20 minutes 30 seconds 
//etc...  

Mungkin memberikan parameter boolean dalam metode format untuk menentukan apakah nilai 0 ditampilkan atau tidak?

CLDR memiliki skema dan data pemformatan daftar, yang mungkin dapat digunakan untuk banyak bahasa, meskipun mungkin banyak bahasa masih memerlukan callback khusus:

http://cldr.unicode.org/development/development-process/design-proposals/list-formatting

Saya cantik untuk fungsi format. Karena menerapkan terjemahan berbagai bahasa mungkin cukup sulit. Penggunaan format seharusnya cukup mudah untuk diterapkan.

Katakanlah Anda ingin

moment.duration(9483000).format('d h m s') // 1 day 2 hours 20 minutes and 30 seconds  
// English  => 'd h m [and] s' 1 day 2 hours 20 minutes and 30 seconds
// French   => 'd, h, m [et] s'   1 jour, 2 heures, 20 minutes et 30 secondes
// Russian  => 'd h m [и] s'   1 день 2 часа 30 минут и 30 секунд

Tidak perlu callback khusus tetapi hanya string format khusus.

Metode duration.countdown() dan duration.countdown(1) diusulkan persis seperti yang saya cari (yaitu apa yang saya lakukan sekarang dalam kode saya sendiri).

Sementara itu, adakah cara untuk memperpanjang prototipe Duration?

Prototipe durasi diekspos melalui moment.duration.fn mirip dengan moment.fn .

Saya telah mengerjakan sesuatu yang serupa tahun lalu di # 143 / # 192. Tim menyarankan sebuah plugin tapi saya tidak pernah meluangkan waktu untuk melakukannya.

Saya akan melakukan reboot pekerjaan saya. Saya harus memperbarui konsep baru seperti objek durasi dll ... Saya adalah tiket ini dan yang lainnya. Sekarang saya sedang memperjuangkan apakah itu masih diperlukan dan jika ya bagaimana kita harus menerapkannya.

Saya tidak ingin menginjak sepatu seseorang jadi saya harus tahu apakah saya bisa membantu. Siapa yang menangani masalah itu sekarang?

Kode saya dapat diformat menjadi unit yang berurutan dan tidak berurutan seperti itu:

test.equal(moment([2012, 0, 1]).diff([2011, 0, 1], 'years\\y'), "1y");
test.equal(moment([2012, 0, 1]).diff([2011, 0, 1], 'months[m]'), "12m");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'months [months] days [days]'), "50 months 19 days");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'years \\y months \\M days \\d'), "4 y 2 M 19 d");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'years[y] days[d]'), "4y 80d");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'years [years] weeks [weeks]'), "4 years 11 weeks");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'years\\y weeks\\w [and] days [days]'), "4y 11w and 3 days");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'days\\d'), "1541d");

Itu tidak menangani unit yang tidak berurutan seperti 'days years' . Itu juga tidak menangani penghapusan nilai nol.

Itu terlihat luar biasa, persis seperti yang saya harapkan!

Ini jelas merupakan fitur yang dibutuhkan semua orang.

Butuh ini!

Sebagai pengganti yang mungkin untuk sebagian dari Anda, saya telah membuat plugin sederhana yang memungkinkan Anda menggunakan countdown.js langsung dari Moment:

moment("1982-5-25").countdown().toString(); // => '30 years, 10 months, 14 days, 2 hours, 23 minutes, and 50 seconds'

Ini melewati setiap opsi Hitung Mundur yang Anda berikan, seperti unit apa yang akan digunakan dan dengan seberapa presisi (Anda dapat melihat dokumen Hitung Mundur). Bagaimanapun, plugin ada di sini: https://github.com/icambron/moment-countdown

@icambron terima kasih atas countribuiton Anda! Ini sangat membantu!

Saya baru saja mulai menggunakan moment.js dan dengan cepat menemukan masalah ini. Ini adalah kode yang saya gunakan untuk menyelesaikannya:

moment.duration.fn.format = function (input) {
    var output = input;
    var milliseconds = this.asMilliseconds();
    var totalMilliseconds = 0;
    var replaceRegexps = {
        years: /Y(?!Y)/g,
        months: /M(?!M)/g,
        weeks: /W(?!W)/g,
        days: /D(?!D)/g,
        hours: /H(?!H)/g,
        minutes: /m(?!m)/g,
        seconds: /s(?!s)/g,
        milliseconds: /S(?!S)/g
    }
    var matchRegexps = {
        years: /Y/g,
        months: /M/g,
        weeks: /W/g,
        days: /D/g,
        hours: /H/g,
        minutes: /m/g,
        seconds: /s/g,
        milliseconds: /S/g
    }
    for (var r in replaceRegexps) {
        if (replaceRegexps[r].test(output)) {
            var as = 'as'+r.charAt(0).toUpperCase() + r.slice(1);
            var value = new String(Math.floor(moment.duration(milliseconds - totalMilliseconds)[as]()));
            var replacements = output.match(matchRegexps[r]).length - value.length;
            output = output.replace(replaceRegexps[r], value);

            while (replacements > 0 && replaceRegexps[r].test(output)) {
                output = output.replace(replaceRegexps[r], '0');
                replacements--;
            }
            output = output.replace(matchRegexps[r], '');

            var temp = {};
            temp[r] = value;
            totalMilliseconds += moment.duration(temp).asMilliseconds();
        }
    }
    return output;
}

Fitur kode ini:

d=moment.duration({hours:1,minutes:1,seconds:1});
d.format('HHH:mm:ss');
"001:01:01"
  • jika Anda menghilangkan satu karakter di templat masukan Anda, dan nilai karakter berikutnya lebih besar dari maksimum biasanya, itu menambahkan karakter sebelumnya, misalnya:
d=moment.duration({days:1, hours:1, minutes: 1});
d.format('H:mm:ss');
"25:01:00"

Kemungkinan masalah:

  • menggunakan Math.floor pada nilai yang diperoleh dari asXxxx, misalnya:
Math.floor(moment.duration(milliseconds)).asHours()
  • Ini berarti bahwa jika ada misalnya, nilai untuk menit atau detik dalam durasi, tetapi Anda menanyakan fungsi format selama berjam-jam, maka tidak akan dibulatkan, itu akan selalu dibulatkan ke bawah.

1 untuk permintaan ini

Secara pribadi saya pikir lebih masuk akal untuk menerapkan metode .format() daripada memiliki beberapa aturan mewah untuk .humanize() atau membuat metode .countdown() . 95% masalah dapat diselesaikan dengan .format() .

Saya setuju bahwa .humanize() seharusnya menawarkan lebih banyak presisi tetapi itu harus merupakan fitur yang berbeda.

Durasi pemformatan harus dimiliki. Detik harus mudah diterjemahkan dalam string yang telah diformat.

Saya mencoba kode stralitik tetapi:
d = moment.duration ({hari: 1, jam: 1, menit: 1}); d. format ('DH: mm: ss');
"1 -215: 01: 00"

+1 untuk format()

Sebagai kasus penggunaan, Durasi yang digunakan dalam ujian waktu (3 jam) dapat diformat dengan mudah sebagai jj: mm (: dd) atau lebih, yang akan jauh lebih mudah. Saat ini, cukup sulit untuk melakukan hal yang sama di Moment sampai saya mencoba vanilla js :)

+1 format durasi!

inilah perbaikan cepat yang saya gunakan:

moment.duration.fn.format = function(){
    str = ""
    if(this.days() > 1) str = str + Math.floor(this.days()) + "d "
    if(this.hours() > 1) str = str + Math.floor(this.hours()) + "h "
    if(this.minutes() > 1) str = str + Math.floor(this.minutes()) + "m "
    if(this.seconds() > 1) str = str + Math.floor(this.seconds()) + "s "
    return str
    }

: +1: untuk duration.format()

: +1: untuk durasi.format () juga

Bagaimana status PR ini? Apa itu jauh?

Code Bounty

Saya telah pergi untuk sementara waktu ... Hampir setahun saya membuat edisi ini. Saya akan mencobanya. Saya akan bercabang sejenak dan memperbarui masalah ini segera setelah saya memiliki sesuatu untuk diuji / ditinjau. Saya harus mempersiapkan diri untuk ujian dalam dua hari. Jadi, tidak mungkin sesuatu akan muncul dalam dua hari. Meski begitu, saya akan mengerjakannya.

@llllix Terima kasih :)

: +1: untuk durasi.format ()

 moment.duration.fn.format = fungsi (nol, dua digit) {
 var hours = this.hours (), minutes = this.minutes (), seconds = this.seconds ();
 var displayFormat = '', zerosFormat = twoDigit? '00': '0', padLeft = twoDigit? -2: -1;
 jika (jam || nol) {
 displayFormat + = (zerosFormat + jam) .slice (padLeft) + 'h';
 }
 if (menit || nol) {
 displayFormat + = (zerosFormat + menit) .slice (padLeft) + 'min';
 }
 jika (detik || nol) {
 displayFormat + = (zerosFormat + detik) .slice (padLeft) + 's';
 }
 return $ .trim (displayFormat);
 }

+1 format durasi.

+1 durasi. Format

+1 durasi. Format

Saya benar-benar membutuhkan pemformatan durasi yang komprehensif, jadi saya meninjau utas di sini dan di StackOverflow dan duduk hari ini untuk menerapkannya.

Saya masih mengerjakan beberapa detail kecil, tetapi intinya sudah selesai dan solid. Saya akan mendapatkan kode, spesifikasi, dan contoh yang diposting di sini dalam beberapa hari mendatang. Ide dasarnya adalah Anda dapat memiliki durasi sewenang-wenang dan memformatnya dengan string yang mirip dengan string format tanggal saat ini, misalnya. format durasi ("h [h] jj: mm: dd") -> 2d 03:47:24

Anda juga dapat menentukan ketepatan desimal sewenang-wenang pada nilai akhir, mis. durasi.format ("jam [jam]", 3) -> 42,384 jam

1 untuk durasi.format

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

Kasus uji dan beberapa contoh ada dalam proyek.
Plugin saya bergantung pada lodash dan underscore.string.

+1 durasi.format ()

Tiket ini telah dibuka lebih dari setahun yang lalu sekarang. Saya ragu itu akan pernah diterapkan.

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

Akankah itu berhasil untuk Anda?

+1 untuk ini juga. Sepertinya kelalaian yang sangat mencolok di perpustakaan yang komprehensif.

https://github.com/rmm5t/jquery-timeago mungkin merupakan template yang baik untuk bagaimana kita dapat menerapkan ini di Moment ...

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

Apakah itu berfungsi untuk kasus penggunaan Anda?

: +1:!

Ini akan berhasil untuk saya (tetapi tidak untuk jangka waktu> 24 jam):

moment.duration.fn.format = function(format) {
  return moment(this.as('milliseconds')).format(format);
}

@jsmreese https://github.com/jsmreese/moment-duration-format Anda yang bergantung pada LoDash adalah penghenti yang nyata. Kami sudah menggunakan garis bawah, dan saya tidak bisa membenarkan peralihan ke LoDash hanya untuk fitur kecil ini. Jika plugin Anda tidak bergantung pada keduanya, itu akan menjadikannya opsi yang lebih layak bagi banyak orang menurut saya.

@wleeper Sangat setuju.

Lingkungan saya kebetulan menggunakan LoDash dan Underscore.String, jadi saya menggunakan metode dari pustaka tersebut - saya memerlukan versi pertama saya beberapa bulan yang lalu dan hanya ingin menerapkannya dan di luar sana.

Saya akan segera menghapus dependensi tersebut.

@wleeper Underscore dan LoDash dimaksudkan agar saling kompatibel. Selama @jsmreese tidak menggunakan apa pun yang tidak ada dalam build Underscore LoDash, Anda seharusnya dapat menggunakan pluginnya apa adanya tanpa masalah.

@ chall8908 Itu masalahnya, dan @wleeper benar - Saya _am_ menggunakan fitur LoDash yang bukan bagian dari build Underscore.

Saya telah menghapus ketergantungan Underscore.String, dan saya sedang mengerjakan kompatibilitas Underscore.

Meskipun plugin format durasi-momen memecahkan salah satu masalah ini, saya pikir kita memerlukan pendekatan yang berfungsi di seluruh lokal (yang, memang, jauh lebih sulit).

Saya pikir kita perlu bekerja untuk menerapkan # 1241, yang akan membuka banyak pintu dalam hal membuat tanggal, durasi, dan daftar relatif yang dapat dibaca manusia di seluruh lokal. formatDuration akan cukup mudah untuk diterapkan jika Momen memiliki akses ke data bahasa CLDR.

Perpustakaan Globalize jQuery sedang bekerja untuk mengatasi banyak masalah yang sama, dan tampaknya logis untuk berkolaborasi dengannya. Twitter juga sudah memiliki perpustakaan yang sangat lengkap yang melakukan banyak hal semacam ini ...

Oke, berikut adalah API yang dapat diterapkan di atas CLDR. Bagaimana menurut anda?

duration:human(bool) // future/past dep/indep
duration:human({
  with(=min+max): 'hours'|'minutes'|'seconds',
  min: 'hours',
  max: 'days',
  float: bool,
  length: "long|short|narrow",
  abs: bool
})
  • min: berapa unit minimum yang digunakan. min: days, artinya jangan sebutkan jam, menit, detik, tetapi bulatkan menjadi hari jika durasinya lebih pendek dari satu hari
  • max: berapa unit maksimum yang akan digunakan. max: hari, artinya tidak menggunakan bulan dan tahun, melainkan jumlah hari masing-masing
  • length: size of token: day vs d untuk bahasa Inggris
  • abs: masa depan / masa lalu independen

: +1: +1

: +1:

+1 durasi. Format

+1 durasi. Format

+1

+1

+1

Ingin ini menampilkan runtime sesuatu.

+1

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

momen-durasi-format versi 1.2.1 diterbitkan di NPM.
Ini berfungsi di Node.js dan Browser.
Itu tergantung pada Lo-Dash atau Underscore, tetapi sekarang diuji dan berfungsi dengan keduanya.
Dependensi Underscore.String asli telah dihapus.

Saya akan menerbitkan versi ini ke Bower segera setelah masalah register / unregister paket Bower saat ini diselesaikan.

1 untuk format durasi

Akan sangat senang jika ini menjadi bagian dari perpustakaan.

+1

+1

+1

: +1:

+1 untuk durasi.format ()

+1

Oh ya, saya pasti akan masuk, setidaknya untuk dapat melakukan moment.duration(3, 'seconds').get('ss') ke keluaran dengan nilai nol di depan.

Apa status permintaan ini? Bantuan apa yang dibutuhkan untuk membuatnya maju?

@tokopedia
Ini ada: https://github.com/jsmreese/moment-duration-format/
Dan dapat melakukan apa yang Anda inginkan, jika Anda tidak keberatan dengan ketergantungan pada Lo-Dash atau Underscore.
Suatu hari nanti saya akan meluangkan waktu untuk menghilangkan ketergantungan itu ...

terkejut bahwa https://github.com/jsmreese/moment-duration-format/ tidak ada di stdlib saat humanize ada. Saya merasa itu melanggar prinsip paling tidak mengejutkan. Setidaknya, kembali ke format numerik sederhana harus dimungkinkan:

moment.duration(123, "minutes").format();
// "2:03:00"

Untuk saat ini saya menggunakan:

moment.utc(moment.duration(300 * 1000).asMilliseconds()).format("HH:mm:ss.SSS")
// 00:05:00.000

Akan sangat senang melihat ini segera sebagai bagian dari moments.js

+1

+1

Pada catatan terkait, duration.toString() mengembalikan [Object object] . Bukankah seharusnya mengembalikan humanize() ?

+1 ingin sekali memiliki kendali lebih atas ini.

+1

Baru saja menerbitkan Format Durasi Momen 1.3.0, yang menghapus ketergantungan sebelumnya pada Lo-Dash atau Underscore. Sekarang satu-satunya ketergantungan adalah Moment.js itu sendiri.

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

@jamkrindonesia :bir:

@jamur_kejang . !
Mengapa ini belum menjadi bagian dari moment.js itu sendiri, saya tidak mengerti. memanusiakan tidak begitu berguna tanpa presisi, mengapa saya ingin membulatkan 1 jam dan 30 menit menjadi 1 jam? .. Tidak ada kasus penggunaan untuk itu.

+1, plugin oleh jsmreese bekerja dengan sangat baik tetapi alangkah baiknya jika itu adalah bagian dari moment.js.

+1. Fitur ini harus masuk dan memanusiakan.

1 untuk durasi.format

@jsmreese menerbitkan pluginnya hampir setahun yang lalu, dan edisi ini dibuka dua tahun lalu. @timrwood @ichernev Bisakah kita memasukkan ini ke perpustakaan moment.js utama?

+1

+1

: +1: untuk durasi.format

+1

: +1:

+1

Apa status saat ini?

Mungkin pengelola menunggu sampai kita mencapai 1000, atau Malam Tahun Baru? @bayu_joo

@gkatsanos - Saya tidak lagi aktif dalam membantu mempertahankan Momen (dan saya selalu hanya penolong), tetapi rekomendasi saya adalah permintaan tarik yang teruji dengan baik. Tentunya ada seseorang yang meminta ini bersedia untuk benar-benar mengkodekannya.

@icambron ini sudah ada sebagai plugin .. apa lagi yang harus dilakukan?
siapa pengelolanya btw?

@icambron bisakah anda menunjuk ke plugin?

dan tampaknya plugin ini berbentuk sangat bagus. kecuali kenyataan itu tergantung pada lodash bukan underscore , apakah ada hal lain yang menghalangi untuk menjadikannya sebagai PR .. sepertinya port dari lodash ke underscore seharusnya tidak terlalu sulit. / cc @jrese

@alexanderbeletsky @gkatsanos Sebenarnya saya telah menghapus lodash atau underscore beberapa waktu yang lalu.

Salah satu kendala utama untuk memasukkan plugin saya ke dalam inti Moment.js adalah kurangnya dukungan i18n penuh.

Dan itu menjadi perhatian utama saya, secara pribadi. Banyak bahasa yang didukung adalah hal yang besar bagi saya, dan saya tidak suka berada dalam situasi di mana Fitur A berfungsi dalam bahasa apa pun, tetapi Fitur B hanya tersedia dalam bahasa Inggris.

@jsmreese mungkin jika membuat beberapa tugas yang didefinisikan dengan baik di repositori Anda, apa yang sebenarnya perlu dilakukan - saya pasti akan membantu.

@mattgrande @alexanderbeletsky Token format sudah dapat disesuaikan, dan templat format berubah-ubah, jadi itu bukan masalah.

Templat format default tidak dilokalkan dengan cara apa pun, dan Anda tidak bisa melokalkan titik desimal atau menambahkan format angka apa pun yang dilokalkan pada nilai. Itu semua yang hilang dari atas kepalaku.

: +1:

Format durasi +1!

sooo .... apa masalahnya dengan ini?

Hanya mampir untuk mencatat beberapa hal, karena ada jutaan komentar di sini. Saya bukan pengelola dan tidak lagi aktif dalam proyek ini, tetapi saya cukup yakin dengan dua hal:

  1. Semuanya, Anda bisa menggunakan plugin @jsmreese . Tampak hebat! Plugin adalah hal yang bagus! ( @jsmreese , jika Anda mau, Anda dapat menambahkannya ke daftar plugin Momen di dokumentasi dengan PR di sini: https://github.com/moment/momentjs.com)
  2. Ini tidak akan dimasukkan dalam inti Momen sampai seseorang a) menginternasionalkannya, b) mengintegrasikan pengujian ke dalam pengujian Momen, dan c) mengirimkan PR. Itu pasti tidak akan terjadi sampai seseorang melakukan itu .

+1 durasi. Format

Format durasi +1!

+1 durasi. Format

+1 durasi. Format. Kasus kami adalah kami ingin menyediakan fungsi di mana seseorang dapat melewatkan beberapa detik dan string yang akan memformatnya. Sekarang kami melakukannya dengan moment.startof ("w"). Add ("s", nrOfSeconds) .format (customFormatString);

Sayangnya minggu lalu ini menghasilkan kesalahan karena startof ("w") adalah hari Minggu dan pada hari Minggu itu adalah waktu musim panas, jadi kami kehilangan satu jam di sana. Tentu saja kita dapat memeriksanya dengan isDSTShifted () tetapi akan tetap luar biasa jika tidak harus mengubah durasi menjadi tanggal hanya untuk memformatnya.

+1 durasi. Format

+1 durasi. Format

+1 untuk duration.format

1 untuk durasi.format

Bisakah kita menutup ini karena tampaknya tidak ada yang benar-benar memberi +1 membaca utas ini?

Pada Rabu, 10 Jun 2015, 08:30 SamFromDaUk [email protected] menulis:

1 untuk durasi.format

-
Balas email ini secara langsung atau lihat di GitHub
https://github.com/moment/moment/issues/463#issuecomment -110751635.

ATAU, perbaiki?

George, menurut saya mereka yang menambahkan +1 secara implisit tidak setuju, dan
hanya menginginkan fitur ini.

Jika notifikasi mengganggu Anda, pertimbangkan untuk berhenti berlangganan dari ini
benang.
Pada 11 Jun 2015 00:07, "George Katsanos" [email protected] menulis:

ATAU, perbaiki?

-
Balas email ini secara langsung atau lihat di GitHub
https://github.com/moment/moment/issues/463#issuecomment -110767322.

Seluruh alasan github tidak memiliki fitur pemungutan suara (dari pemahaman saya) adalah karena hal itu menghambat diskusi.

Anda dapat secara implisit tidak menyetujui semua yang Anda inginkan, itu tidak membantu. Jika Anda tidak setuju itu bagus, baca seluruh utas dan berikan argumen Anda (khususnya, argumen baru atau poin apa pun yang menurut Anda telah dipertimbangkan dengan buruk).

Saya masih berlangganan karena menurut saya ada beberapa argumen menarik yang harus dibuat, saya berharap untuk mendengarnya, tetapi tim tidak boleh tunduk pada tekanan teman belaka.

Saya dapat mengonfirmasi apakah plugin @icambron yang disebutkan di atas berfungsi.

Jika Anda seperti saya, Anda menginginkan .fromNow() dengan output yang lebih luas (seperti hitungan mundur pengiriman amazon). Berikut cara melakukannya:

// include the plugin
var cutoffDate = moment().add(3, 'hours'); // some date in the future that we're counting down to
var now = moment();
var output = moment.duration(cutoffDate.diff(now)).format('h [hours] m [minutes] s [seconds]');
// "3 hours 0 minutes 0 seconds"

ya, saya juga akan menjelaskannya - moment.duration (). format () berfungsi dengan plugin ini: https://github.com/jsmreese/moment-duration-format

jika Anda menggunakan meteor, pilih oaf:moment-duration-format

Sepertinya ini tidak berhasil untuk saya, saya menggunakan moment .diff antara dua kali, yang berhasil, masalahnya adalah saat itu antara "pm" dan "am", katakanlah saya bepergian pada jam 9 malam dan mendarat 02:00, saya harus mendapatkan jumlah waktu yang tepat.

@ Markj89 Anda perlu membuka topik stackoverflow.

+1

+1

+1

: +1:

+1 untuk menutup masalah ini. menggunakan plugin adalah solusi yang solid.

+1

+1

+1 di .format()

+1, masih belum diterapkan setelah 4 tahun? : D

+1

Btw. Saya pikir itu harus memungkinkan untuk mengurai format manusiawi juga. Misalnya tidak sulit untuk mengurai 7 days and 5 hours ...

Hanya ingin menekankan bahwa plugin @jsmreese bekerja dengan baik!

: +1:

+1 durasi. Format

+1 format durasi

+1 durasi. Format

+1 durasi. Format

: +1:

Saya akan menutup ini demi # 1048. Itu tidak berarti itu hilang, kami hanya memiliki dua masalah yang berusia beberapa tahun dan keduanya bermuara pada 'membuat format durasi'. Yang lainnya menjelaskan ini dengan lebih jelas.

+1 durasi. Format

+1 durasi. Format

+1

Gunakan .localeData (). RelativeTime (45, true, 'mm') dan dapatkan 45 menit, dan seterusnya;)

+1 Sangat banyak yang dibicarakan tentang hal ini namun belum diterapkan. Bahkan ada paket terpisah untuk https://github.com/jsmreese/moment-duration-format ini

untuk menampilkan durasi dalam format apa pun, cukup ubah durasi menjadi ms lalu ke momen:
moment(duration.as('milliseconds')).format('HH:mm:ss')

Terima kasih! Apakah ini di dokumen? Saya tidak melihatnya ...

Ini tidak ada dalam dokumen karena tidak berfungsi. Ini adalah peretasan menggunakan epoch unix untuk menafsirkan milidetik sebagai titik waktu sejak zaman tersebut. Jadi, itu berantakan jika durasi Anda 24 jam atau lebih.

Beberapa hal tentang kode ini:

  1. Token hh adalah token yang dimaksudkan untuk digunakan dengan AM / PM, jadi durasi Anda hanya akan naik hingga 12

  2. Bahkan jika Anda menggunakan token HH, yang akan naik menjadi 23, durasi Anda tidak boleh lebih dari 23: 59: 59.999, karena semuanya akan berpindah ke tanggal berikutnya

  3. Saat kode ini ditulis, kode ini hanya akan berfungsi di server yang menggunakan UTC. Browser apa pun di zona waktu yang berbeda akan memberikan hasil yang tidak diharapkan.

Jika Anda ingin menggunakan peretasan ini, itu harus ditulis sebagai:

moment.utc(duration.as('milliseconds')).format('HH:mm:ss')

Tapi seperti yang saya tunjukkan, ini hanya akan berfungsi jika durasi Anda di bawah 24 jam. Setelah itu, kembali ke titik awal 1.

Terima kasih. Butuh beberapa saat bagi saya hari ini untuk mengetahui bahwa seseorang dapat menggabungkan .minutes() dengan .seconds() . Sebut saya bodoh, tetapi tidak jelas bagi saya dari dokumen apa perbedaan antara .seconds() dan .asSeconds() langsung ... Tapi sekarang saya melihat itu sebenarnya ada! :)

misalnya: console.log(duration.minutes()+":"+duration.seconds());

Saya akan tetap menggunakan metode ini.

@elasticsteve Anda mungkin juga ingin menambahkan nol di depan ke bagian detik jika kurang dari sepuluh. :mengedipkan:

@butterflyhug @elasticsteve sebenarnya itulah alasan utama mengapa saya ingin menggunakan format . dalam kasus saya, ini adalah penghitung waktu singkat yang sederhana jadi solusi @maggiepint sudah cukup untuk kebutuhan saya.
moment.utc(duration.asMilliseconds()).format('HH:mm:ss')

@agivo poin yang bagus! Sekarang solusi @maggiepint terlihat lebih menarik. Server saya adalah UTC.

Tentu, saya benar-benar mengerti. Saya juga menggunakan peretasan itu dalam kode produksi. Tetapi saya tidak akan merekomendasikannya sebagai solusi umum (terlepas dari beberapa kasus penggunaan tertentu), karena ada banyak situasi di mana gagal parah. (Misalnya durasi negatif adalah kasus kegagalan penting lainnya yang belum disebutkan secara eksplisit.)

+1

+1 durasi.format () !!!!!!!!!

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1 durasi debug yang sulit

+1

Anda dapat dengan mudah melakukan sesuatu seperti:

    var duration = moment().add(5, 'days') -  moment().local();
    var s = Math.floor( (duration/1000) % 60 );
    var m = Math.floor( (duration/1000/60) % 60 );
    var h = Math.floor( (duration/(1000*60*60)) % 24 );
    var d = Math.floor( duration/(1000*60*60*24) );
    return d + ' days ' + h + ' hours ' + m + ' minutes ' + s  + ' seconds before the deadline.';   
    // 4 days 23 hours 59 minutes 59 seconds before the deadline.

Minta satu pengguna twitter

Anda dapat dengan mudah melakukan sesuatu seperti:

    var duration = moment().add(5, 'days') -  moment().local();
    var s = Math.floor( (duration/1000) % 60 );
    var m = Math.floor( (duration/1000/60) % 60 );
    var h = Math.floor( (duration/(1000*60*60)) % 24 );
    var d = Math.floor( duration/(1000*60*60*24) );
    return d + ' days ' + h + ' hours ' + m + ' minutes ' + s  + ' seconds before the deadline.';   
    // 4 days 23 hours 59 minutes 59 seconds before the deadline.

Uggly, tapi efektif.

2019, masih membutuhkan fitur ini.

Parameter sederhana dalam memanusiakan, .eg humanize(precise: true) , yang akan menghindari semua pembulatan sudah cukup untuk membuat semua orang senang. Selain itu, pembulatan adalah bagian yang sulit untuk diterapkan. Selebihnya hanya sederhana mengubah durasi seperti pemformatan lain yang dilakukan dengan format ().

Ada metode moment yang bagus bernama fromNow() yang akan mengembalikan waktu dari waktu tertentu dalam bentuk yang dapat dibaca manusia, seperti ini:

moment('2019-04-30T07:30:53.000Z').fromNow() // an hour ago || a day ago || 10 days ago

Atau jika Anda menginginkannya di antara dua tanggal tertentu, Anda dapat menggunakan:

var a = moment([2007, 0, 28]);
var b = moment([2007, 0, 29]);
a.from(b); // "a day ago"

Diambil dari Dokumen:

Bisakah ini dibuka kembali? Ini adalah fungsi yang sangat mendasar.

Dalam kasus saya, saya menemukan paket yang memecahkan masalah saya:
https://github.com/EvanHahn/HumanizeDuration.js

Mungkin berguna untuk orang lain juga. :)

Juli 2019 dan fitur ini masih belum tersedia.

Juli 2019 dan fitur ini masih belum tersedia.

Belum mencobanya, tapi saya baru menyadari ini!
npm install moment-duration-format

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

September 2019 masih resmi ketinggalan fitur ini

d.format('H:mm:ss');
"1:01:01"

Juga berharap bisa memiliki fitur ini

d.format('D-H:mm:ss'); // existence of D will mod hours to 24
"999-23:59:59"

Jika ada yang bertanya-tanya mengapa ini ditutup: https://github.com/moment/moment/issues/463#issuecomment -228543000

Ini sama sekali tidak ideal, tetapi saya akhirnya melakukan sesuatu seperti ini sebagai solusi. Saya memiliki objek duration dengan hitungan mundur untuk mengeluarkan pengguna setelah tidak aktif, dan ingin memformat waktu yang tersisa.

// What I did:
private getTimeString(duration: moment.Duration): string {
    const time = moment()
      .seconds(duration.seconds())
      .minutes(duration.minutes());

    return time.format('mm:ss');
}

// What I'd rather do (as many others have mentioned)...
private getTimeString(duration: moment.Duration): string {
    return duration.format('mm:ss');
}

Solusi hacky saya:

import moment from 'moment';

const formatInt = (int: number): string => {
  if (int < 10) {
    return `0${int}`;
  }
  return `${int}`;
};

export const formatDuration = (time: string): string => {
  const seconds = moment.duration(time).seconds();
  const minutes = moment.duration(time).minutes();
  const hours = moment.duration(time).hours();
  if (hours > 0) {
    return `${formatInt(hours)}:${formatInt(minutes)}:${formatInt(seconds)}`;
  }
  if (minutes > 0) {
    return `${formatInt(minutes)}:${formatInt(seconds)}`;
  }
  return `00:${formatInt(seconds)}`;
};

2020

Saya menggunakan metode berikut, semoga bermanfaat bagi orang lain :)

function formatDuration(duration, format) {
  const date = moment().startOf('day');
  return date.add(duration).format(format);
}

(Saya hanya menggunakan untuk memformat durasi antara 00:00 dan 23:59)

Masih butuh ini

Bantuan 'get' ini untuk memformat sesuai keinginan Anda:

  duration.get('years')
  duration.get('months')
  duration.get('days')
  duration.get('hours')
  duration.get('minutes')
  duration.get('seconds')

Apa yang saya kerjakan:

const formatDuration = ms => {
  const days = Math.floor(ms / 8.64e7);
  const msOnLastDay = ms - days * 8.64e7;
  return (days < 10 ? "0" + days : days) + ":" + moment.utc(msOnLastDay).format("HH:mm:ss.SSS");
};
formatDuration(5)
"00:00:00:00.005"
formatDuration(500)
"00:00:00:00.500"
formatDuration(50000)
"00:00:00:50.000"
formatDuration(5000000)
"00:01:23:20.000"
formatDuration(500000000)
"05:18:53:20.000"
// for reference
JSON.stringify(moment.duration(500000000)._data, null, 2)
"{
  "milliseconds": 0,
  "seconds": 20,
  "minutes": 53,
  "hours": 18,
  "days": 5,
  "months": 0,
  "years": 0
}"

Juli 2019 dan fitur ini masih belum tersedia.

Belum mencobanya, tapi saya baru menyadari ini!
npm install moment-duration-format

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

Ini berfungsi dengan baik :)

Permainan sudah berakhir :)

Terima kasih, hargai itu !!!


De: Aleksey Makas [email protected]
Enviado: sexta-feira, 9 de outubro de 2020 11:03
Para: moment / moment [email protected]
Cc: Douglas Aguiar [email protected] ; Komentar [email protected]
Assunto: Re: [momen / momen] Durasi fitur hilang (# 463)

Permainan sudah berakhir :)

-
Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub https://github.com/moment/moment/issues/463#issuecomment-706200427 , atau berhenti berlangganan https://github.com/notifications/unsubscribe-auth/AGD22DRNGNIQMOJFQY7VW3DSJ4J4VANCNFSM4ABRUZLA .

Apakah halaman ini membantu?
5 / 5 - 1 peringkat