Jak zdobyć znacznik czasu UTC w Rubim?

137

Jak zdobyć znacznik czasu UTC w Rubim?

Mohit Jain
źródło

Odpowiedzi:

117
time = Time.now.getutc

Uzasadnienie: W moich oczach znacznik czasu jest dokładnie tym: punktem w czasie. Można to dokładnie przedstawić za pomocą obiektu. Jeśli potrzebujesz czegoś innego, wartości skalarnej, np. Sekund od epoki Uniksa, interwałów 100 ns od 1601 r. Lub może łańcucha do celów wyświetlania lub przechowywania znacznika czasu w bazie danych, możesz łatwo uzyskać to z obiektu. Ale to zależy w dużej mierze od zamierzonego zastosowania.

Stwierdzenie, że »prawdziwy znacznik czasu to liczba sekund, które upłynęły od epoki Uniksa« to trochę mija się z celem, ponieważ jest to jeden ze sposobów przedstawienia punktu w czasie, ale wymaga również dodatkowych informacji, aby wiedzieć, że masz do czynienia czas, a nie liczba. TimeObiekt rozwiązuje ten problem ładnie reprezentując punkt w czasie , a także jako wyraźny, co to jest .

Joey
źródło
93
To daje obiekt czasu, należy Time.now.to_i, aby uzyskać prawdziwy znacznik czasu
rafamvc
3
Moim zdaniem obiekt jest wystarczająco znacznikiem czasu, a Ty nadal masz całą swobodę, jakiej potrzebujesz. W większości przypadków sprowadzenie go do wartości skalarnej nie jest konieczne.
Joey
2
Znaczniki czasu odnoszą się do epoki - nie ma znaczenia, w której strefie czasowej się znajdujesz. Odpowiedź manżikowa jest lepsza.
Ryan Mohr
2
Chociaż ładne wyjaśnienie, dlaczego nie należy używać znacznika czasu unixa, nie odpowiada na pytanie OP (ani to samo pytanie, które miałem, gdy znalazłem ten post). Znaczniki czasu systemu Unix są wymagane w wielu przypadkach (np. W przypadku interfejsów API). Nawet po wyjaśnieniu ta odpowiedź nie dawała rzeczywistego sposobu na uzyskanie znacznika czasu.
utknął
5
@stuckj, w żadnym momencie pytanie nie wspomina o sygnaturze czasowej Uniksa. Po prostu nadal otrzymuję głosy przeciw tej odpowiedzi, ponieważ ludzie wydają się myśleć, że »timestamp == czas uniksowy«, stąd wyjaśnienie.
Joey
247

Można użyć: Time.now.to_i.

manzhikov
źródło
1
Czy bardziej sensowne byłoby wykonanie Time.now.getutc.to_i? Czy jest to zasadniczo równoważne?
utknął
20
sygnatura czasowa jest taka sama we wszystkich strefach czasowych. :)
manzhikov
2
O tak, duh. Pytanie Brainfart. :)
stuckj
to jest najwłaściwsza odpowiedź!
Darlan Dieterich
46

Moim zdaniem domyślne formatowanie nie jest zbyt przydatne. Wolę ISO8601, ponieważ można go sortować, stosunkowo kompaktowy i powszechnie rozpoznawany:

>> require 'time'
=> true
>> Time.now.utc.iso8601
=> "2011-07-28T23:14:04Z"
Tim Sylvester
źródło
1
Zauważ, że ta metoda pochodzi z ActiveSupport, a nie ze standardowej biblioteki rubydoc.info/docs/rails/ActiveSupport%2FTimeWithZone:iso8601
n0nick
3
@ n0nick jesteś pewien, nawet w 2.0? Wiem, że używałem go w instalacjach „waniliowych” bez szyn itp. I jest dostępny /usr/share/ruby/2.0/time.rb.
Tim Sylvester
15

Zazwyczaj sygnatura czasowa nie ma strefy czasowej.

% irb
> Time.now.to_i == Time.now.getutc.to_i
=> true
Yuki Matsukura
źródło
1
to_fbędzie lepiej
xis
1
zależy od sytuacji.
Yuki Matsukura
1
Kiedy ma datownik posiada strefę czasową?
Dennis
1
sygnatura czasowa nie jest związana ze strefą czasową. Innymi słowy, znacznik czasu to UTC.
Yuki Matsukura
1
@YukiMatsukura Właściwie to też nie jest do końca dokładne. Znacznik czasu nie reprezentuje nawet żadnej strefy czasowej, więc „znacznik czasu to UTC” jest tak samo prawdziwe, jak „znacznik czasu to kupa słonia”. Problem tkwi w reprezentacji. Większość programistów przedstawia to jako znacznik czasu Unix (który nie wskazuje UTC ani żadnej innej strefy czasowej, ponieważ jest to tylko wartość całkowita).
The Pellmeister
10

jeśli potrzebujesz czytelnej dla człowieka sygnatury czasowej (tak jak ma to miejsce w przypadku migracji szyn) np. „ 20190527141340

Time.now.utc.to_formatted_s(:number)  # using Rails

Time.now.utc.strftime("%Y%m%d%H%M%S") # using Ruby
Kate Kasinskaya
źródło
7

Po co jest znacznik czasu z jego szczegółowością podawaną w sekundach? Uważam, że praca z nimi jest o wiele bardziej praktyczna Time.now.to_f. Heck, może nawet rzucić to_s.sub('.','')się pozbyć przecinkiem lub wykonać typecast takiego: Integer(1e6*Time.now.to_f).

chava
źródło
dzięki. Użyłem tego: Integer(1e3*Time.now.to_f)tak, że mój znacznik czasu ruby ​​po stronie serwera był taki sam jak javascript po stronie klientaDate.now()
joshweir
2

Time.utc(2010, 05, 17)

August Lilleaas
źródło
-2

time = Time.zone.now()

Będzie działać jako

irb> Time.zone.now
=> 2017-12-02 12:06:41 UTC
Gwiazdka
źródło
Jonathan, czy możesz mi powiedzieć, co jest nie tak w tej odpowiedzi?
Gwiazdka
1
To zależy od tego, co Ruby jest lokalną strefą czasową. Będzie działać zgodnie z oczekiwaniami tylko wtedy, gdy lokalny TZ to UTC.
MasterCheffinator
-6

Właściwym sposobem jest wykonanie a, Time.now.getutc.to_iaby uzyskać odpowiednią wartość znacznika czasu, ponieważ zwykłe wyświetlenie liczby całkowitej nie musi zawsze być takie samo jak znacznik czasu utc ze względu na różnice stref czasowych.

Sumit Bisht
źródło
7
Wszyscy inni tak mówili, więc po co to kopiować bez nowych informacji, z 3-letnim opóźnieniem?
Kaspar Lee,
2
I bez interpunkcji, która sprawiłaby, że zdanie 1, które jest trochę za długie i nie jest całkowicie poprawne składniowo, byłoby jaśniejsze.
Emile Vrijdags