Ruby / Rails: chuyển đổi một ngày thành dấu thời gian UNIX


202

Làm cách nào tôi có được dấu thời gian UNIX (số giây kể từ 1970 GMT) từ một đối tượng Ngày trong ứng dụng Rails?

Tôi biết Time#to_itrả về dấu thời gian, nhưng thực hiện Date#to_timevà sau đó nhận được dấu thời gian sẽ dẫn đến kết quả là khoảng một tháng (không biết tại sao ...).

Bất kỳ trợ giúp được đánh giá cao, cảm ơn!

Chỉnh sửa: OK, tôi nghĩ rằng tôi đã tìm ra nó - Tôi đã xử lý một ngày nhiều lần trong một vòng lặp và mỗi lần ngày được di chuyển một chút vì không khớp múi giờ, cuối cùng dẫn đến dấu thời gian của tôi là một tháng. Tuy nhiên, tôi vẫn muốn biết liệu có cách nào để làm điều này mà không cần dựa vào không Date#to_time.

Câu trả lời:


350

date.to_time.to_inên hoạt động tốt. Phiên bảng điều khiển Rails bên dưới hiển thị một ví dụ:

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

Lưu ý rằng đối tượng DateTime trung gian là theo giờ địa phương, do đó dấu thời gian có thể mất vài giờ so với những gì bạn mong đợi. Nếu bạn muốn làm việc trong thời gian UTC, bạn có thể sử dụng phương thức "to_utc" của DateTime.


3
DateTime không cóto_utc
Green

12
date.to_time.utccó lẽ là những gì anh ấy có nghĩa.
Adam Eberlin

3
Trong Rails, thông qua ActiveSupport, một phiên bản DateTime có phương thức utc () (cũng được đặt bí danh là getutc)
Gokul

71

Tôi nhận được những điều sau đây khi tôi thử nó:

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

Sự khác biệt giữa hai con số này là do thực tế là Datekhông lưu trữ giờ, phút hoặc giây của thời gian hiện tại. Chuyển đổi một Datethành một Timesẽ dẫn đến ngày hôm đó, nửa đêm.


9

Các tùy chọn được đề xuất sử dụng to_utchoặc utcđể sửa lỗi bù thời gian cục bộ không hoạt động. Đối với tôi, tôi thấy Time.utc()việc sử dụng hoạt động chính xác và mã bao gồm ít bước hơn:

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

đấu với

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

Đây là những gì xảy ra khi bạn gọi utc sau khi sử dụng 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

... Vì vậy, việc gọi rõ ràng to_isẽ đưa ra dấu thời gian sai.


8

Giải pháp cho Ruby 1.8 khi bạn có một đối tượng DateTime tùy ý:

1.8.7-p374 :001 > require 'date'
 => true 
1.8.7-p374 :002 > DateTime.new(2012, 1, 15).strftime('%s')
 => "1326585600"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.