Làm cách nào để có dấu thời gian UTC trong Ruby?


Câu trả lời:


117
time = Time.now.getutc

Đặt vấn đề: Trong mắt tôi một dấu thời gian chính xác là: Một điểm trong thời gian. Điều này có thể được đại diện chính xác với một đối tượng. Nếu bạn cần bất cứ thứ gì khác, một giá trị vô hướng, ví dụ vài giây kể từ thời kỳ Unix, 100 giây kể từ năm 1601 hoặc có thể là một chuỗi cho mục đích hiển thị hoặc lưu trữ dấu thời gian trong cơ sở dữ liệu, bạn có thể dễ dàng lấy được từ đối tượng. Nhưng điều đó phụ thuộc rất nhiều vào mục đích sử dụng của bạn.

Nói rằng »dấu thời gian thực là số giây kể từ thời kỳ Unix« thiếu một chút điểm, vì đó là một cách để thể hiện một điểm trong thời gian, nhưng nó cũng cần thêm thông tin để biết rằng bạn đang xử lý một thời gian và không phải là một con số Một Timeđối tượng giải quyết vấn đề này một cách độc đáo bằng cách trình bày một điểm trong thời gian và cũng rõ ràng về nó là gì .


93
Điều đó mang lại cho đối tượng thời gian, bạn nên đến Time.now.to_i để có dấu thời gian thực sự
rafamvc

3
Theo ý kiến ​​của tôi, một đối tượng đủ thời gian và bạn vẫn có tất cả sự tự do mà bạn cần. Giảm nó đến một giá trị vô hướng trong hầu hết các trường hợp không thực sự cần thiết.
Joey

2
Dấu thời gian có liên quan đến kỷ nguyên - không quan trọng bạn đang ở múi giờ nào. Câu trả lời của manzhikov là tốt hơn.
Ryan Mohr

2
Mặc dù một lời giải thích hay về lý do tại sao không sử dụng dấu thời gian unix, nhưng điều này không trả lời câu hỏi OP (cũng không phải câu hỏi tương tự mà tôi có khi tôi tìm thấy bài đăng này). Dấu thời gian Unix được yêu cầu trong nhiều trường hợp (ví dụ: đối với API). Ngay cả sau khi giải thích, câu trả lời này đã không đưa ra cách thực tế để có được dấu thời gian.
mắc kẹt vào

5
@stuckj, không có câu hỏi nào đề cập đến dấu thời gian Unix. Tôi chỉ tiếp tục nhận được downvote cho câu trả lời này bởi vì mọi người dường như nghĩ rằng »dấu thời gian == thời gian Unix«, do đó giải thích.
Joey

246

Bạn có thể sử dụng : Time.now.to_i.


1
Nó sẽ có ý nghĩa hơn để làm Time.now.getutc.to_i? Hay về cơ bản là tương đương?
mắc kẹt vào

20
dấu thời gian là giống nhau trong tất cả các múi giờ. :)
manzhikov

2
Ồ vâng, duh. Câu hỏi Brainfart. :)
mắc kẹt vào

Đây là phản ứng thích hợp nhất!
Darlan Dieterich

46

Định dạng mặc định là không hữu ích, theo ý kiến ​​của tôi. Tôi thích ISO8601 vì nó có thể sắp xếp, tương đối nhỏ gọn và được công nhận rộng rãi:

>> require 'time'
=> true
>> Time.now.utc.iso8601
=> "2011-07-28T23:14:04Z"

1
Lưu ý rằng phương pháp này xuất phát từ ActiveSupport, không phải trong thư viện chuẩn rubydoc.info/docs/rails/ActiveSupport%2FTimeWithZone:iso8601
n0nick

3
@ n0nick bạn có chắc không, ngay cả trong 2.0? Tôi biết tôi đã sử dụng nó trên cài đặt "vanilla" không có đường ray vv, và nó ở /usr/share/ruby/2.0/time.rb.
Tim Sylvester

15

Thông thường dấu thời gian không có múi giờ.

% irb
> Time.now.to_i == Time.now.getutc.to_i
=> true

1
to_fsẽ tốt hơn
xis

1
tùy theo hoàn cảnh.
Yuki Matsukura

1
Khi nào dấu thời gian có múi giờ?
Dennis

1
dấu thời gian không liên quan đến múi giờ. Nói cách khác, dấu thời gian là UTC.
Yuki Matsukura

1
@YukiMatsukura Thật ra, điều đó cũng không hoàn toàn chính xác. Dấu thời gian thậm chí không đại diện cho bất kỳ múi giờ nào, vì vậy "dấu thời gian là UTC" cũng đúng như "dấu thời gian là phân của voi". Vấn đề là trong đại diện. Hầu hết các nhà phát triển đại diện cho nó dưới dạng dấu thời gian Unix (không biểu thị UTC hoặc bất kỳ múi giờ nào khác vì đây chỉ là một giá trị số nguyên).
Pellmeister

10

nếu bạn cần một dấu thời gian có thể đọc được của con người (như di chuyển đường ray có) ex. " 20190527141340 "

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

Time.now.utc.strftime("%Y%m%d%H%M%S") # using Ruby

7

Điều gì tốt là một dấu thời gian với độ chi tiết của nó được đưa ra trong vài giây? Tôi thấy nó thực tế hơn nhiều khi làm việc với Time.now.to_f. Heck, bạn thậm chí có thể ném một to_s.sub('.','')để loại bỏ dấu thập phân hoặc thực hiện một kiểu chữ như thế này : Integer(1e6*Time.now.to_f).


cảm ơn. Tôi đã sử dụng điều này: Integer(1e3*Time.now.to_f)để dấu thời gian ruby ​​phía máy chủ của tôi giống như javascript phía máy kháchDate.now()
joshweir


-2

time = Time.zone.now()

Nó sẽ hoạt động như

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

Jonathan, bạn có thể cho tôi biết những gì sai trong câu trả lời này?
Dấu hoa thị

1
Điều này phụ thuộc vào những gì Ruby là múi giờ địa phương. Nó sẽ hoạt động như mong đợi chỉ khi TZ cục bộ là UTC.
MasterCheffinator

-6

Cách thích hợp là thực hiện Time.now.getutc.to_iđể có được số lượng dấu thời gian thích hợp vì đơn giản là hiển thị số nguyên không nhất thiết phải giống với dấu thời gian utc do chênh lệch múi giờ.


7
Mọi người khác nói vậy, tại sao chỉ cần sao chép nó, không có thông tin mới, trễ 3 năm?
Kaspar Lee

2
Và không có dấu câu nào sẽ tạo thành 1 câu, hơi dài và không hoàn toàn chính xác về mặt cú pháp, rõ ràng hơn.
Emile Vrijdags
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.