Ruby / Rails: konwersja daty na znacznik czasu Uniksa

Jak uzyskać uniksowy znacznik czasu (liczba sekund od 1970 GMT) z obiektu daty w aplikacji Rails?

Wiem, że Time#to_i zwraca znacznik czasu, ale zrobienie Date#to_time, a następnie uzyskanie znacznika czasu skutkuje czymś, co jest wyłączone o około miesiąc (Nie wiem dlaczego...).

Każda pomoc jest doceniana, dzięki!

Edit: OK, myślę, że to rozgryzłem - przetwarzałem datę kilka razy w pętli, i za każdym razem, gdy data była przesuwana trochę z powodu niedopasowania strefy czasowej, ostatecznie co prowadzi do tego, że mam miesiąc wolnego. Mimo to, chciałbym wiedzieć, czy jest jakiś sposób, aby to zrobić bez polegania na Date#to_time.

Author: igul222, 2009-11-27

5 answers

Kod date.to_time.to_i powinien działać poprawnie. Sesja konsoli Rails poniżej pokazuje przykład:

>> Date.new(2009,11,26).to_time
=> Thu Nov 26 00:00:00 -0800 2009
>> Date.new(2009,11,26).to_time.to_i
=> 1259222400
>> Time.at(1259222400)
=> Thu Nov 26 00:00:00 -0800 2009

Zauważ, że pośredni obiekt DateTime jest w czasie lokalnym, więc znacznik czasu może być o kilka godzin wyłączony od tego, czego się spodziewasz. Jeśli chcesz pracować w czasie UTC, możesz użyć metody DateTime "To_utc".

 310
Author: David Grayson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-05 00:30:20

Dostaję następujące, gdy próbuję:

>> Date.today.to_time.to_i
=> 1259244000
>> Time.now.to_i
=> 1259275709

Różnica między tymi dwoma liczbami wynika z faktu, że Date nie przechowuje Godzin, Minut ani sekund bieżącego czasu. Konwersja Date na Time spowoduje, że tego dnia, o północy.

 62
Author: Ryan Bigg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-26 22:49:33

Rozwiązanie dla Ruby 1.8 gdy masz dowolny obiekt DateTime:

1.8.7-p374 :001 > require 'date'
 => true 
1.8.7-p374 :002 > DateTime.new(2012, 1, 15).strftime('%s')
 => "1326585600"
 7
Author: Nowaker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-03 15:13:36

Sugerowane opcje użycia to_utc lub utc do ustalenia lokalnego przesunięcia czasu nie działają. Dla mnie okazało się, że użycie Time.utc() działa poprawnie, a kod obejmuje mniej kroków:

> Time.utc(2016, 12, 25).to_i
=> 1482624000 # correct

Vs

> Date.new(2016, 12, 25).to_time.utc.to_i
=> 1482584400 # incorrect

Oto, co się dzieje, gdy wywołujesz utc po użyciu Date....

> Date.new(2016, 12, 25).to_time
=> 2016-12-25 00:00:00 +1100 # This will use your system's time offset
> Date.new(2016, 12, 25).to_time.utc
=> 2016-12-24 13:00:00 UTC

...więc najwyraźniej wywołanie to_i da zły znacznik czasu.

 5
Author: Gerry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-11 07:33:16
DateTime.new(2012, 1, 15).to_time.to_i
 3
Author: wang sky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-18 11:19:56