Saya merasa ada cara sederhana / bawaan untuk melakukan ini tetapi saya tidak dapat menemukannya.
Saya memiliki durasi (dalam detik) dalam bilangan bulat dan saya ingin menampilkannya dalam format yang bersahabat.
misalnya 3600 akan ditampilkan sebagai "01:00:00" atau "1 jam" atau semacamnya.
Saya dapat melakukannya dengan time_ago_in_words(Time.zone.now+3600)
tetapi itu terasa seperti sedikit retakan, tidak ada alasan untuk menambah / mengurangi dari waktu saat ini hanya untuk memformat nilai ini. Apakah ada duration_in_words()
atau sesuatu?
Terima kasih
ruby-on-rails
ruby
datetime
ruby-on-rails-3
cydonia
sumber
sumber
distance_of_time_in_words
dan Anda bisa mendapatkan angka yang dibulatkan dengan mengopervague: true
sebagai opsi.Menyimpulkan:
berasumsi bahwa
total_seconds = 3600
Pilihan 1:
Pilihan 2:
Opsi 3:
gunakan Option1 jika anda menginginkan kata-kata, Option2 jika anda ingin format H: M: S, Option3 jika anda ingin format H: M: S dan bisa lebih dari 24 jam
sumber
01:00:00
.%
Operator tali Ruby terlalu tidak dihargai dan sering dilupakan.Mengingat t adalah durasi dalam detik, ini memancarkan string yang dipisahkan oleh titik dua dengan bantalan nol termasuk hari. Contoh:
Menyenangkan.
sumber
%
mengatakan, "Ambillah array parameter dari kanan saya dan memasukkan mereka ke dalam format string di sebelah kiri saya." Dalam hal ini, mirip denganprintf
di C \ C ++ hanya lebih ringkas dan dapat digunakan dalam sebuah tugas. Ya, saya menyebutnya indah. Dan kuat. Ada contoh yang akan mendemonstrasikan kefasihan ini dengan lebih baik, tetapi mereka tidak akan menjawab pertanyaannya. Snark Anda tidak dihargai, btw.Saya rasa Anda juga bisa melakukan sesuatu seperti:
Untuk memformatnya sesuai keinginan.
BTW, awalnya saya berpikir untuk menggunakan Time.at () tetapi tampaknya waktu EPOCH di Ubuntu saya adalah Kam 01 Jan 01:00:00 +0100 1970 dan bukan jam 00:00:00 seperti yang saya harapkan, dan oleh karena itu jika saya melakukannya:
Memberi saya 1 jam lebih dari yang diinginkan.
sumber
Saya menggunakan ini untuk menunjukkan durasi waktu di Proyek Rails saya:
Tambahkan metode khusus ke
Integer
kelas. Anda dapat membuat file baru bernamapretty_duration.rb
dalaminitializers
folder:Hubungi
seconds.pretty_duration
di mana saja dalam proyek Anda:Jawaban ini dibangun di atas Kode Lev Lukomsky
sumber
Yang ini menggunakan
divmod
metode tidak jelas untuk membagi dan modulo pada saat yang sama, sehingga menanganiFloat
detik dengan benar:sumber
Menggunakan
Time.utc.strftime
hanya berfungsi untuk nilai-nilai ketika jumlah total jam kurang dari 24 :Untuk nilai yang lebih besar, hasilnya salah:
Saya sarankan menggunakan metode paling sederhana yang saya temukan untuk masalah ini:
Anda selalu dapat menyesuaikan nilai yang dikembalikan dengan kebutuhan Anda.
sumber
Hati-hati dengan durasinya lebih dari satu hari.
sumber
Jawaban yang terinspirasi dari Lev Lukomsky yang memanfaatkan ActiveSupport :: Durasi, dan menangani milidetik (berguna untuk kode benchmark)
Tentu saja Anda dapat memperpanjang ini dengan mudah dengan hari, bulan, tahun, dll menggunakan metode ActiveSupport terkait dan mengulangi struktur yang sama.
Perlu diingat bahwa untuk durasi yang terlalu lama, ini mungkin tidak akurat karena durasi 1 bulan tidak tetap dalam jumlah hari, dan saya tidak yakin bagaimana AS: Durasi menangani hal itu.
sumber
Hanya untuk memasukkan 2 sen saya:
Dibangun dari jawaban Xiao Bin.
sumber
Teriak ke @joshuapinter yang memberikan jawaban terbaik (berupa komentar ).
Gunakan pengganti drop-in
dotiw
permata untuk mendapatkan kontrol lebih besar atas keakuratan output agar sesuai dengan kebutuhan yang berbeda:https://github.com/radar/distance_of_time_in_words
Contoh kode tampilan:
Menghasilkan sesuatu seperti ini:
sumber
ActiveSupport::Duration.build
+inspect
memberi Anda hasil yang validsumber
sumber