2012-06-18 16 views
67

Flickr API dostarcza dacie umieszczenia jak Unix timestamp jednym: „The posted date is always passed around as a unix timestamp, which is an unsigned integer specifying the number of seconds since Jan 1st 1970 GMT.formatować datę przy użyciu Ruby on Rails

Na przykład tutaj jest data „1100897479”. Jak sformatować go za pomocą Ruby on Rails?

Odpowiedz

26

Easiest is to use strftime (docs).

Jeśli jest do stosowania na pierwszej stronie, lepiej zawinąć go w pomocnika, choć.

+1

Nie wymyśliłem, jak z niego korzystać. Czy możesz podać mi mały przykład? – Alexandre

+6

my_date_variable.strftime ("% m /% d /% Y") –

+6

strftime nie jest SUCHY. Proszę nie rozpraszać strftime po swoich projektach. Przynajmniej wspomniałeś pomocnika, ale 'config/initializers/time_formats.rb' jest bardziej idiomatyczny dla Rails. – PhilT

6

Najpierw trzeba konwertować znacznik czasu do aktualnej Ruby Date/Time. Jeśli otrzymasz go po prostu jako ciąg lub int z facebook, trzeba będzie zrobić coś takiego:

my_date = Time.at(timestamp_from_facebook.to_i) 

Następnie sformatować go ładnie w widoku, można po prostu użyć to_s (dla formatowania domyślnego) :

<%= my_date.to_s %> 

należy pamiętać, że jeśli nie umieścić to_s, to nadal będzie nazywany domyślnie, jeśli używasz go w widoku lub w łańcuchu np dodaje również zadzwonić to_s dniu:

<%= "Here is a date: #{my_date}" %> 

lub jeśli chcesz datę sformatowaną w specyficzny sposób (na przykład za pomocą „d/M/Y”) - można wykorzystać strftime jak przedstawiono w drugiej odpowiedzi .

+0

Ten kod zgłasza błąd 'puts Time.at ('1100897479')' - nie można przekonwertować ciągu na dokładną liczbę (TypeError) – Alexandre

+0

Ah, przybywa jako ciąg znaków? dobrze więc "to_i", aby upewnić się, że jest to int (przykład powyżej edytowany, aby to uwzględnić) –

1

Ponieważ znaczniki czasu są sekund od początku epoki UNIX, można użyć DateTime.strptime („string czas składniowy”) z prawidłową specyfikacją:

Date.strptime('1100897479', '%s') 
#=> #<Date: 2004-11-19 ((2453329j,0s,0n),+0s,2299161j)> 
Date.strptime('1100897479', '%s').to_s 
#=> "2004-11-19" 
DateTime.strptime('1100897479', '%s') 
#=> #<DateTime: 2004-11-19T20:51:19+00:00 ((2453329j,75079s,0n),+0s,2299161j)> 
DateTime.strptime('1100897479', '%s').to_s 
#=> "2004-11-19T20:51:19+00:00" 

pamiętać, że muszą require 'date' za to do pracy, a następnie można to nazwać jako Date.strptime (jeśli zależy ci tylko na dacie) lub DateTime.strptime (jeśli chcesz ustawić datę i godzinę). Jeśli potrzebujesz innego formatowania, można zadzwonić DateTime#strftime (patrzeć na strftime.net, jeśli masz trudności z ciągów format) na nim lub użyć jednego z wbudowanych metod, takich jak rfc822.

172

Po przeanalizowaniu ciągu znaków czasowych i określeniu obiektu czasu (zobacz inne odpowiedzi, aby uzyskać szczegółowe informacje), możesz użyć Time.to_formatted_s z Rails. Ma wbudowane kilka formatów, które można określić za pomocą symboli.

Cytat:

time = Time.now      # => Thu Jan 18 06:10:17 CST 2007 

time.to_formatted_s(:time)   # => "06:10" 
time.to_s(:time)     # => "06:10" 

time.to_formatted_s(:db)   # => "2007-01-18 06:10:17" 
time.to_formatted_s(:number)  # => "20070118061017" 
time.to_formatted_s(:short)   # => "18 Jan 06:10" 
time.to_formatted_s(:long)   # => "January 18, 2007 06:10" 
time.to_formatted_s(:long_ordinal) # => "January 18th, 2007 06:10" 
time.to_formatted_s(:rfc822)  # => "Thu, 18 Jan 2007 06:10:17 -0600" 

(Time.to_s jest aliasem)

Można również zdefiniować własne formaty - zwykle do inicjowania (Dzięki Dave Newton za wskazanie na to uwagę). Oto, jak to się robi:

# config/initializers/time_formats.rb 
Time::DATE_FORMATS[:month_and_year] = "%B %Y" 
Time::DATE_FORMATS[:short_ordinal] = lambda { |time| time.strftime("%B #{time.day.ordinalize}") } 
+0

+1; najłatwiejsze rozwiązanie, gdy pojawi się data, zwłaszcza jeśli działa jeden z istniejących formatów. –

+0

Myślę, że istnieje nawet sposób rejestrowania nowych formatów. – CMW

+4

Tak, przez mapę w inicjalizatorach. –

13

@ Odpowiedź CMW to huk na pieniądze. Dodałem tę odpowiedź jako przykład jak skonfigurować inicjatora tak, że obie daty i godziny przedmioty dostać formatowania

config/inicjatorów/time_formats.rb

date_formats = { 
    concise: '%d-%b-%Y' # 13-Jan-2014 
} 

Time::DATE_FORMATS.merge! date_formats 
Date::DATE_FORMATS.merge! date_formats 

także następujące dwa polecenia będą iterację wszystkich DATE_FORMATS w obecnych warunkach, a wyświetlacz dzisiejszej daty i czasu w każdym formacie:

Time::DATE_FORMATS.keys.each{|k| puts [k,Date.today.to_s(k)].join(':- ')} 
Time::DATE_FORMATS.keys.each{|k| puts [k,Time.now.to_s(k)].join(':- ')} 
7

spojrzeć localize lub l

np

l Time.at(1100897479) 
+1

To najlepsze rozwiązanie, ponieważ format może się różnić w zależności od ustawień narodowych. Możesz również dodać dowolną liczbę niestandardowych formatów, jak chcesz: zobacz http://guides.rubyonrails.org/i18n.html#adding-date-time-formats –

33

Oto moja odpowiedź na to,

więc najpierw musisz przekonwertować znacznik czasu na rzeczywistą datę/czas Ruby. Jeśli otrzymasz go po prostu jako ciąg lub int z facebook, trzeba będzie zrobić coś takiego:

my_date = Time.at(timestamp_from_facebook.to_i) 

Ok, więc teraz zakładając masz już swój obiekt Date ...

to_formatted_s to poręczna funkcja Ruby, która zamienia daty w sformatowane łańcuchy.

Oto kilka przykładów jego użycia:

time = Time.now      # => Thu Jan 18 06:10:17 CST 2007  

time.to_formatted_s(:time)   # => "06:10" 
time.to_s(:time)     # => "06:10"  

time.to_formatted_s(:db)   # => "2007-01-18 06:10:17" 
time.to_formatted_s(:number)  # => "20070118061017" 
time.to_formatted_s(:short)   # => "18 Jan 06:10" 
time.to_formatted_s(:long)   # => "January 18, 2007 06:10" 
time.to_formatted_s(:long_ordinal) # => "January 18th, 2007 06:10" 
time.to_formatted_s(:rfc822)  # => "Thu, 18 Jan 2007 06:10:17 -0600" 

Jak widać: : DB: liczba,: krótki ... są niestandardowe formaty daty.

Aby dodać własny format niestandardowy, można utworzyć ten plik config/inicjatorów/time_formats.rb i dodać tam własne formaty, na przykład tutaj jest jeden:

Date::DATE_FORMATS[:month_day_comma_year] = "%B %e, %Y" # January 28, 2015 

Gdzie : month_day_comma_year to nazwa twojego formatu (możesz zmienić to na dowolne) i gdzie % B% e,% Y jest formatem daty unix.

Oto krótki Cheatsheet dniu wydania UNIX składni, dzięki czemu można szybko skonfigurować swoją Format niestandardowy:

From http://linux.die.net/man/3/strftime  

    %a - The abbreviated weekday name (``Sun'') 
    %A - The full weekday name (``Sunday'') 
    %b - The abbreviated month name (``Jan'') 
    %B - The full month name (``January'') 
    %c - The preferred local date and time representation 
    %d - Day of the month (01..31) 
    %e - Day of the month without leading 0 (1..31) 
    %g - Year in YY (00-99) 
    %H - Hour of the day, 24-hour clock (00..23) 
    %I - Hour of the day, 12-hour clock (01..12) 
    %j - Day of the year (001..366) 
    %m - Month of the year (01..12) 
    %M - Minute of the hour (00..59) 
    %p - Meridian indicator (``AM'' or ``PM'') 
    %S - Second of the minute (00..60) 
    %U - Week number of the current year, 
      starting with the first Sunday as the first 
      day of the first week (00..53) 
    %W - Week number of the current year, 
      starting with the first Monday as the first 
      day of the first week (00..53) 
    %w - Day of the week (Sunday is 0, 0..6) 
    %x - Preferred representation for the date alone, no time 
    %X - Preferred representation for the time alone, no date 
    %y - Year without a century (00..99) 
    %Y - Year with century 
    %Z - Time zone name 
    %% - Literal ``%'' character  

    t = Time.now 
    t.strftime("Printed on %m/%d/%Y") #=> "Printed on 04/09/2003" 
    t.strftime("at %I:%M%p")   #=> "at 08:56AM" 

Nadzieja to pomogło ci. Zrobiłem również github gist tego małego przewodnika, na wypadek, gdyby ktoś wolał.

+0

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej dołączyć części odpowiedzi tutaj i podać link do odniesienia. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. - [Z recenzji] (/ recenzja/niskiej jakości-posts/10586543) –

+0

Witam @MihaiCaracostea, ponownie zrobiłem moją odpowiedź po twojej rady, dzięki :) – eduwass