ฉันเขียนแอปพลิเคชั่น Rails แต่ดูเหมือนจะไม่สามารถหาเวลาที่สัมพันธ์กันได้เช่นถ้ามีการกำหนดเวลาที่แน่นอนสามารถคำนวณได้ "30 วินาทีก่อน" หรือ "2 วันก่อน" หรือถ้านานกว่าหนึ่งเดือน "9/1/2551" เป็นต้น
ฉันเขียนแอปพลิเคชั่น Rails แต่ดูเหมือนจะไม่สามารถหาเวลาที่สัมพันธ์กันได้เช่นถ้ามีการกำหนดเวลาที่แน่นอนสามารถคำนวณได้ "30 วินาทีก่อน" หรือ "2 วันก่อน" หรือถ้านานกว่าหนึ่งเดือน "9/1/2551" เป็นต้น
คำตอบ:
ดูเหมือนว่าคุณกำลังมองหาtime_ago_in_words
วิธีการ (หรือdistance_of_time_in_words
) จาก ActiveSupport เรียกว่าเป็นแบบนี้:
<%= time_ago_in_words(timestamp) %>
ActiveSupport
ActionView::Helpers::DateHelper
helper
ว่าคุณสามารถโทรและเข้าถึงวิธีการเหล่านี้ helper.time_ago_in_words(timestamp)
require 'active_support/core_ext'
ก่อนอื่นจากนั้นคุณก็พร้อมสำหรับการใช้งาน7.days.ago
และโครงสร้างอื่น ๆ ที่คล้ายคลึงกัน
ฉันได้เขียนสิ่งนี้ แต่ต้องตรวจสอบวิธีการที่มีอยู่ที่กล่าวถึงเพื่อดูว่าดีขึ้นหรือไม่
module PrettyDate
def to_pretty
a = (Time.now-self).to_i
case a
when 0 then 'just now'
when 1 then 'a second ago'
when 2..59 then a.to_s+' seconds ago'
when 60..119 then 'a minute ago' #120 = 2 minutes
when 120..3540 then (a/60).to_i.to_s+' minutes ago'
when 3541..7100 then 'an hour ago' # 3600 = 1 hour
when 7101..82800 then ((a+99)/3600).to_i.to_s+' hours ago'
when 82801..172000 then 'a day ago' # 86400 = 1 day
when 172001..518400 then ((a+800)/(60*60*24)).to_i.to_s+' days ago'
when 518400..1036800 then 'a week ago'
else ((a+180000)/(60*60*24*7)).to_i.to_s+' weeks ago'
end
end
end
Time.send :include, PrettyDate
return
บรรทัดภายในcase
ภายใต้คำสั่งelse
และลบทั้งหมดของreturn
s
+99
+800
+180000
ไหมว่าทำไมมี
เพียงชี้แจงโซลูชันของ Andrew Marshall เพื่อใช้time_ago_in_words
(สำหรับ Rails 3.0 และ Rails 4.0)
หากคุณอยู่ในมุมมอง
<%= time_ago_in_words(Date.today - 1) %>
หากคุณอยู่ในคอนโทรลเลอร์
include ActionView::Helpers::DateHelper
def index
@sexy_date = time_ago_in_words(Date.today - 1)
end
ตัวควบคุมไม่มีโมดูลActionView :: Helpers :: DateHelper ที่นำเข้าตามค่าเริ่มต้น
NB มันไม่ใช่ "ทางรถไฟ" ที่จะนำเข้าผู้ช่วยเหลือเข้าไปในตัวควบคุมของคุณ ผู้ช่วยเหลือมีไว้เพื่อช่วยในการดู time_ago_in_wordsวิธีการก็ตัดสินใจที่จะเป็นมุมมองของนิติบุคคลในMVCสาม (ฉันไม่เห็นด้วย แต่เมื่ออยู่ในกรุงโรม ... )
เกี่ยวกับอะไร
30.seconds.ago
2.days.ago
หรืออย่างอื่นที่คุณกำลังยิงเพื่อ?
คุณสามารถใช้ตัวดำเนินการทางคณิตศาสตร์เพื่อทำเวลาสัมพัทธ์
Time.now - 2.days
จะให้คุณ 2 วันที่ผ่านมา
2.days.since
หรือ2.days.from_now
บางสิ่งเช่นนี้จะได้ผล
def relative_time(start_time)
diff_seconds = Time.now - start_time
case diff_seconds
when 0 .. 59
puts "#{diff_seconds} seconds ago"
when 60 .. (3600-1)
puts "#{diff_seconds/60} minutes ago"
when 3600 .. (3600*24-1)
puts "#{diff_seconds/3600} hours ago"
when (3600*24) .. (3600*24*30)
puts "#{diff_seconds/(3600*24)} days ago"
else
puts start_time.strftime("%m/%d/%Y")
end
end
#{diff_seconds/360}
#{diff_seconds/3600}
ควรจะเป็น ฉันแก้ไขมันแล้ว
เนื่องจากคำตอบส่วนใหญ่ที่นี่แนะนำtime_ago_in_words time_ago_in_words
แทนที่จะใช้:
<%= time_ago_in_words(comment.created_at) %>
ใน Rails ต้องการ:
<abbr class="timeago" title="<%= comment.created_at.getutc.iso8601 %>">
<%= comment.created_at.to_s %>
</abbr>
พร้อมกับห้องสมุด jQuery http://timeago.yarp.com/พร้อมรหัส:
$("abbr.timeago").timeago();
ข้อได้เปรียบหลัก: แคช
http://rails-bestpractices.com/posts/2012/02/10/not-use-time_ago_in_words/
time_ago_in_words
ไม่ใช่เวลาS
ดูวิธีการอินสแตนซ์ที่นี่:
มีวิธีการที่มีประโยชน์เช่นเมื่อวาน, วันพรุ่งนี้, วันที่เริ่มต้นของ _ วัน _ สัปดาห์, เป็นต้น
ตัวอย่าง:
Time.now.yesterday
Time.now.ago(2.days).end_of_day
Time.now.next_month.beginning_of_month
ฉันเขียนอัญมณีที่ทำสิ่งนี้กับวัตถุ Rails ActiveRecord ตัวอย่างใช้ created_at แต่จะทำงานกับ updated_at หรืออะไรก็ได้ที่มีคลาส ActiveSupport :: TimeWithZone
เพียงแค่ติดตั้งอัญมณีและเรียกใช้เมธอด 'สวย' ในอินสแตนซ์ของ TimeWithZone ของคุณ
หากคุณกำลังสร้างแอปพลิเคชั่น Rails คุณควรใช้
Time.zone.now
Time.zone.today
Time.zone.yesterday
สิ่งนี้จะให้เวลาหรือวันที่ในเขตเวลาที่คุณกำหนดค่าแอปพลิเคชัน Rails ของคุณ
ตัวอย่างเช่นหากคุณกำหนดค่าแอปพลิเคชันของคุณให้ใช้ UTC Time.zone.now
จะอยู่ในเวลา UTC เสมอ (จะไม่ได้รับผลกระทบจากการเปลี่ยนแปลงของฤดูร้อนของอังกฤษ)
การคำนวณเวลาสัมพัทธ์เป็นเรื่องง่ายเช่น
Time.zone.now - 10.minute
Time.zone.today.days_ago(5)
อีกวิธีหนึ่งคือการยกเลิกการโหลดตรรกะบางอย่างจากแบ็กเอนด์และ maek เบราว์เซอร์ทำงานโดยใช้ปลั๊กอิน Javascript เช่น: