Jak zdobyć znacznik czasu UTC w Rubim?


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 .


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.


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"

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

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

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).


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 = Time.zone.now()

Będzie działać jako

irb> Time.zone.now
=> 2017-12-02 12:06:41 UTC

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.