Pengurangan Tanggal Ruby (misal 90 hari yang lalu)

89

Saya telah sedikit dimanjakan oleh Joda-time API:

DateTime now = new DateTime();
DateTime ninetyDaysAgo = now.minusDays(90);

Saya mencoba melakukan hal serupa di Ruby, tapi saya

now = Time.now
ninetyDaysAgo = now - (90*24)

Namun, matematikanya mati di sini (saya benar-benar bekerja dengan tanggal di tengah malam).

Apakah ada API ramah untuk pengurangan tanggal?

darthtrevino
sumber

Jawaban:

105
require 'date'
now = Date.today
ninety_days_ago = (now - 90)

Menjalankan ini melalui konsol IRB saya mendapatkan:

>>require 'date'
now = Date.today
ninety_days_ago = (now - 90)

require 'date'
=> false
now = Date.today
=> #<Date: 2011-03-02 (4911245/2,0,2299161)>
ninety_days_ago = (now - 90)
=> #<Date: 2010-12-02 (4911065/2,0,2299161)>

Kalau butuh waktu bisa bilang saja now = DateTime.now

Matt
sumber
Posting asli Anda, pra-edit lebih dekat dengan apa yang saya butuhkan, tetapi Date.Now dilindungi. Date.today bekerja. Jika Anda mengubah uraian pertama Anda menjadi baris sekarang = Date.today, saya akan menerimanya.
darthtrevino
3
@ Mat: dan bagaimana cara mengurangi 90 jam, bukan hari?
Esteban Feldman
@EstebanFeldman Datejuga mengizinkan pecahan jadi Anda bisa melakukannya Date.today - (90.0/24.0). Hasilnya dapat dengan mudah diubah to_datetimeatau to_timejuga.
jchook
15

Bagi mereka yang menggunakan Rails, lihat yang berikut ini:

DateTime.now - 10.days
=> Sat, 04 May 2013 12:12:07 +0300

20.days.ago - 10.days
=> Sun, 14 Apr 2013 09:12:13 UTC +00:00
Abdo
sumber
10

Jika Anda menggunakan Rails atau tidak keberatan menyertakan ActiveSupport, Anda dapat menggunakan DSL # hari seperti ini:

ruby-1.9.2-p136 :002 > Date.today
 => Wed, 02 Mar 2011 
ruby-1.9.2-p136 :003 > Date.today - 90.days
 => Thu, 02 Dec 2010 

Karena Anda bekerja dengan tanggal alih-alih waktu, Anda juga harus mulai dengan contoh Tanggal, atau mengonversi intance DateTime Anda dengan #to_date. Saat menambahkan / mengurangi angka dari contoh tanggal, jumlahnya secara implisit adalah hari.

ruby-1.9.2-p136 :016 > DateTime.now.to_date
 => #<Date: 2011-03-02 (4911245/2,0,2299161)> 
ruby-1.9.2-p136 :017 > DateTime.now.to_date - 90
 => #<Date: 2010-12-02 (4911065/2,0,2299161)> 
Gabe Martin-Dempesy
sumber
8

Ruby mendukung aritmatika tanggal di kelas Date dan DateTime , yang merupakan bagian dari pustaka standar Ruby. Kedua kelas tersebut mengekspos # + dan # - metode, yang menambah dan mengurangi hari dari tanggal atau waktu.

$ irb
 > require 'date'
 => true 
 > (DateTime.new(2015,4,1) - 90).to_s  # Apr 1, 2015 - 90 days
 => "2015-01-01T00:00:00+00:00"
 > (DateTime.new(2015,4,1) - 1).to_s   # Apr 1, 2015 - 1 day
 => "2015-03-31T00:00:00+00:00" 

Gunakan metode # << dan # >> untuk beroperasi pada bulan, bukan hari. Aritmatika pada bulan sedikit berbeda dengan aritmatika pada hari. Menggunakan Date daripada DateTime membuat efeknya lebih jelas.

 > (Date.new(2015, 5, 31) << 3).to_s  # May 31 - 3 months; 92 days diff
 => "2015-02-28" 

Mengikuti contoh joda-time Anda, Anda mungkin menulis sesuatu seperti ini di Ruby.

now =  DateTime.now
ninety_days_ago = now - 90

atau mungkin saja

ninety_days_ago = DateTime.now - 90
Mike Sherrill 'Cat Recall'
sumber
5

Ini adalah postingan yang sangat lama, tetapi jika Anda ingin tetap menggunakan suatu Timeobjek, seperti yang awalnya diminta, daripada beralih ke Dateobjek yang mungkin ingin Anda pertimbangkan untuk digunakan Ruby Facets.

Ruby Facets adalah pustaka ekstensi standar untuk kelas inti Ruby.

http://rubyworks.github.io/facets/

Dengan meminta Facet, Anda kemudian dapat melakukan hal berikut dengan objek Time.

Time.now.less(90, :days)

bigtunacan
sumber
Proyek ini belum diperbarui selama dua tahun dan telah membuka masalah dengan satu komentar. Sudah mati.
pengguna4674453
@ user4674453 Pembaruan terakhir adalah enam bulan yang lalu. Ini adalah pustaka stabil yang masih berfungsi dengan versi Ruby terbaru. Tidak semua basis kode perlu diperbarui setiap hari agar tidak dianggap "mati".
bigtunacan
5

gunakan jumlah detik:

Time.now - 90*24*60*60
Rubi
sumber
-1

Solusi sederhana:

days90_ago = 90.days.ago.to_date.to_s

OUTPUT:
puts 90_days_ago
=> "2019-10-09" # considering cur_date: 2020-01-07
Ravistm
sumber
Ini menggunakan ActiveSupport (Rails).
Espen