आप रेल में रिश्तेदार समय कैसे करते हैं?


220

मैं एक रेल एप्लिकेशन लिख रहा हूं, लेकिन यह नहीं जान सकता कि सापेक्ष समय कैसे तय किया जा सकता है, अर्थात यदि एक निश्चित समय वर्ग दिया जाता है, तो यह "30 सेकंड पहले" या "2 दिन पहले" की गणना कर सकता है या यदि यह एक महीने से अधिक लंबा हो। "9/1/2008", आदि।


1
'गणना' गलत शब्द लगता है, क्या आपका मतलब 'आउटपुट' था?
लूलाला

जवाबों:


366

ऐसा लगता है जैसे आप ActiveSupport से time_ago_in_wordsविधि (या distance_of_time_in_words) खोज रहे हैं । इसे इस तरह से कॉल करें:

<%= time_ago_in_words(timestamp) %>

4
एक रूबी नौसिखिया के लिए संकेत कैसे irb में इसे चलाने के लिए? मैं चलाता हूं: 'active_support' की आवश्यकता है और फिर 'time_ago_in_words (Time.now)' आज़माएं, लेकिन फ़ंक्शन नहीं मिला है।
cboettig

2
@ कॉबीटिग इसका हिस्सा नहीं है ActiveSupport, यह इसमें परिभाषित है ActionView::Helpers::DateHelper
माइकल कोहल

19
यदि आप एक रेल कंसोल में हैं, तो आपको 'active_support' की आवश्यकता नहीं है। एक कंसोल विधि है जिसे helperआप इन विधियों को कॉल और एक्सेस कर सकते हैं। helper.time_ago_in_words(timestamp)
मैट पोलीटो ऑक्ट

2
बस फी, अगर आप इसे irb, या सादे रूबी में चाहते हैं, तो बस a: require 'active_support/core_ext' सबसे पहले करें, और फिर आप उपयोग करने के लिए 7.days.agoऔर अन्य समान निर्माणों के लिए तैयार हैं।
इसी तरह

1
महान! मैं अभी कुछ सैंपल कोड की उम्मीद करके यहाँ आया हूँ और मुझे यह मिल गया है। मुझे माणिक और रेल्स से प्यार है
Marcelo Biffara

53

मैंने इसे लिखा है, लेकिन यह देखने के लिए कि क्या वे बेहतर हैं, मौजूदा तरीकों की जाँच करनी होगी।

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

1
हम, मैं पहले माणिक पढ़ा, और माणिक ActiveSupport बॉक्स से बाहर नहीं है। तो मुझे लगता है कि यह पोस्ट अधिक माणिक है। हालाँकि वास्तविक प्रश्न में रेल का उल्लेख है।
जॉनके

रेल एक वेब फ्रेमवर्क है और अंतर्निहित भाषा रूबी है। इसलिए रेल के सवाल पर कुछ रूबी कोड प्राप्त करना सामान्य है। यहां तक ​​कि अगर मानक रूबी में ActiveRecord शामिल नहीं है, तो यह सिर्फ एक "मणि स्थापित activerecord" कमांड के साथ समर्थित है।
मिकेलएफएम

7
आप अंतिम स्टेटमेंट returnको caseस्टेटमेंट के अंतर्गत रख सकते हैं else, और सभी को हटा सकते हैं return
आरा

2
क्या कोई बता सकता है कि वहाँ क्यों है +99 +800 +180000?
गौरव शाह

+99 क्योंकि "एक घंटे पहले" का अंत 7100 पर समाप्त होता है, जो दो घंटे से 100 सेकंड कम है। इसी तरह, +800, चूंकि 172000 दो दिनों (172800 सेकंड) से 800 सेकंड कम है, और आगे भी।
फ्रेड

22

एंड्रयू_ मार्शल के समाधान को स्पष्ट करने के लिए time_ago_in_words का उपयोग करें
(रेल 3.0 और रेल 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 :: हेल्पर्स :: DateHelper डिफ़ॉल्ट रूप से आयात किया गया।

NB यह आपके नियंत्रकों में सहायकों को आयात करने के लिए "रेल मार्ग" नहीं है। मदद करने वाले विचारों के लिए सहायक होते हैं। Time_ago_in_words विधि एक होने का फैसला किया गया था दृश्य में इकाई MVC त्रय। (मैं सहमत नहीं हूँ, लेकिन जब रोम में ...)


20

व्हाट अबाउट

30.seconds.ago
2.days.ago

या कुछ और आप के लिए शूटिंग कर रहे थे?


19
यह सवाल क्या कह रहा है से पीछे की ओर है।
xaxxon

12

आप सापेक्ष समय का उपयोग करने के लिए अंकगणितीय ऑपरेटरों का उपयोग कर सकते हैं।

Time.now - 2.days 

2 दिन पहले दे देंगे।


10
क्या आप 2.days.ago के बारे में जानते हैं?
webmat

2
क्या 'Time.now + 2.days' के लिए शॉर्टहैंड विधि है?
स्टीफन

23
@ निक्सनजा: 2.days.sinceया2.days.from_now
ब्रायन डोनोवन

5
यह सवाल क्या पूछ रहा था से पीछे की ओर है। time_ago_in_words प्रश्न का उत्तर है।
xaxxon

आपका बहुत बहुत धन्यवाद।
जिगर भट्ट

10

कुछ इस तरह काम करेगा।

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

11
यह अनिवार्य रूप से दूरी_of_time_in_words
हचिन्स ग्रांट

2
जिसका अर्थ है कि आपको इसका उपयोग नहीं करना चाहिए और आपको
एक्सएक्सएक्स

यह मुझे पूरी तरह से ठीक लगता है। यह आपको बाकी स्ट्रिंग्स को कस्टमाइज़ करने की अनुमति देता है। यानी "3 सेकंड पहले" बनाम "3s पहले"
छापे में

#{diff_seconds/360}होना चाहिए #{diff_seconds/3600}। मैंने इसे संपादित किया है।
फेमरेफ

7

चूंकि ज्यादातर जवाब यहाँ पता चलता है time_ago_in_words

के बजाय का उपयोग करने का :

<%= time_ago_in_words(comment.created_at) %>

रेल में, पसंद करें:

<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/


1
वास्तव में, यह है time_ago_in_wordsनहीं समय एस
23tux

6

उदाहरण के तरीकों पर एक नज़र डालें:

http://apidock.com/rails/Time

यह उपयोगी तरीके हैं जैसे कि कल, कल, Begin_of_week, पहले, आदि।

उदाहरण:

Time.now.yesterday
Time.now.ago(2.days).end_of_day
Time.now.next_month.beginning_of_month

1

मैंने एक रत्न लिखा है जो रेल्स एक्टिव ऑब्जेक्ट्स के लिए ऐसा करता है। उदाहरण create_at का उपयोग करता है, लेकिन यह Active_upport :: TimeWithZone के साथ update_at या कुछ भी काम करेगा।

बस मणि स्थापित करें और अपने TimeWithZone उदाहरण पर 'सुंदर' विधि को कॉल करें।

https://github.com/brettshollenberger/hublot


1

यदि आप रेल एप्लिकेशन का निर्माण कर रहे हैं, तो आपको उपयोग करना चाहिए

Time.zone.now
Time.zone.today
Time.zone.yesterday

यह आपको उस समय या तारीख का समय देता है जिसमें आपने अपने रेल एप्लिकेशन को कॉन्फ़िगर किया है।

उदाहरण के लिए, यदि आप UTC का उपयोग करने के लिए अपने एप्लिकेशन को कॉन्फ़िगर करते हैं, तो Time.zone.nowहमेशा UTC समय में होगा (उदाहरण के लिए ब्रिटिश समरटाइम के परिवर्तन से यह प्रभावित नहीं होगा)।

सापेक्ष समय की गणना करना आसान है, जैसे

Time.zone.now - 10.minute
Time.zone.today.days_ago(5)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.