[英]Rails find difference between two dates
我想計算用戶成為我的應用程序成員的時間。 我應該將其顯示為:
User member for 2y, 9m
為此,我在用戶 model 內部創建了方法
def member_for
#calculate number of months
month = (Time.current.year * 12 + Time.current.month) - (created_at.year * 12 + created_at.month)
#an array [years, months]
result = month.divmod(12)
if result[0].zero? && result[1].nonzero?
"User member for #{result[1]}m"
elsif result[1].zero? && result[0].nonzero?
"User member for #{result[0]}y"
elsif result[0].zero? && result[1].zero?
'User member for 1m'
else
"User member for #{result[0]}y, #{result[1]}m"
end
end
但老實說這段代碼有異味,難道 Rails6 中沒有一些內置方法可以更好地做到這一點,讓代碼看起來更干凈一些嗎?
您可以為此使用ActiveSupport::Duration 。 您需要做的就是將時間差傳遞給ActiveSupport::Duration.build
方法。 例如:
time_diff = Time.now - 1000.days.ago
ActiveSupport::Duration.build(time_diff.to_i) # 2 years, 8 months, 3 weeks, 5 days, 28 minutes, and 47 seconds
ActiveSupport::Duration.build(time_diff.to_i).parts # 2 years, 8 months, 3 weeks, 5 days, 28 minutes, and 47 seconds
如果您想避免與distance_of_time_in_words
* 相關的緩存/時區頭痛,這將基本上使您的緩存響應/片段持續無效,那么只需 output 一個 HTML5 時間元素並使用像moment.js這樣的 JS 庫來計算經過的時間並顯示它用戶:
module TimeHelper
def time_tag(date_or_time, **options)
tag.time(datetime: date_or_time.iso8601, **options)
end
end
$ yarn install moment
// app/javascripts/packs/application.js
require('moment');
<% @users.each do |user| %>
<p><%= time_tag(user.created_at, class: 'member-since') %></p>
<% end %>
document.querySelectorAll('time.member-since').forEach((el) => { const m = moment(el.dateTime); const str = `User has been a member for ${m.toNow(true)}`; const textnode = document.createTextNode(str); el.appendChild(textnode); });
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js" integrity="sha512-qTXRIMyZIFb8iQcfjXWCO8+M5Tbc38Qi5WzdPOYZHIlZpzBHG3L3by84BBBOiRGiEb7KKtAOAs5qYdUiZiQNNQ==" crossorigin="anonymous"></script> <p><time datetime="2001-05-15T19:00" class="member-since" /></p> <p><time datetime="2005-05-15T09:00" class="member-since" /></p> <p><time datetime="2021-04-15T09:00" class="member-since" /></p>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.