Tôi có một dấu thời gian ở UTC
"2010-10-25 23:48:46 UTC"
Tôi cần chuyển đổi nó thành ISO 8601
"2010-10-29 06: 09Z"
Tài liệu thật khó hiểu - cách dễ nhất để làm điều đó là gì?
Câu trả lời:
Tôi nghĩ bạn đang cố lừa chúng tôi.
Ngày nhập cho câu hỏi của bạn là ngày 25 tháng 10 năm 2010 , trong khi ngày đầu ra là ngày 29 tháng 10 năm 2010 . Chơi tốt!
Tiếp tục chủ đề chọn nit này: thời gian của bạn cũng hoàn toàn khác và bạn đang bỏ lỡ giây so với thời gian xuất.
Bây giờ cho câu trả lời thực sự.
Tuy nhiên, một chút thực tế đầu tiên: đầu ra ISO 8601 trong Ruby tương tự như đầu ra "Ngày và giờ kết hợp" từ trang Wikipedia của ISO 8601 .
Bạn có một chuỗi và vì vậy bạn sẽ cần chuyển đổi nó thành một Time
đối tượng mà bạn có thể thực hiện to_time
. Sau đó, việc đơn giản là gọi iso8601
đối tượng đó nhận phiên bản ISO 8601:
"2010-10-25 23:48:46 UTC".to_time.iso8601
Các to_time
phương pháp là biếu không của Rails, trong khi iso8601
là biếu không của thư viện chuẩn của Ruby.
Sau nhiều thử nghiệm, tôi thấy trình phân tích cú pháp của thư viện Thời gian tốt hơn DateTime, mặc dù lý do khiến tôi không thể tránh khỏi lúc này. Với lời cảnh báo đó, tôi luôn sử dụng Time thay vì DateTime cho loại nội dung này và tài liệu ruby cũng khó tìm hiểu tại sao lại như vậy,
require 'time'
puts Time.parse("2010-10-25 23:48:46 UTC").iso8601
"2010-10-25T23:48:46Z"
Time.parse("...").utc.iso8601
:, tùy chỉnh khác, bạn sẽ nhận được thời gian kèm theo +03:00
hoặc một số giá trị khác tùy thuộc vào múi giờ chuỗi thời gian gốc được cung cấp. Ý tôi là thay vì Z
.
Lưu ý: bạn phải chuyển đổi (phân tích cú pháp) một chuỗi thời gian thành một đối tượng thời gian trước khi bạn có thể áp dụng phương thức to_time.
ruby-1.9.2-p180 :016 > "2010-10-25 23:48:46 UTC".to_time.iso8601
NoMethodError: undefined method `to_time' for "2010-10-25 23:48:46 UTC":String
from (irb):16
Quy trình đúng:
irb> ut = DateTime.parse("2010-10-25 23:48:46 UTC")
irb> ut.iso8601
=> "2010-10-25T23:48:46+00:00"
Thêm một câu trả lời cho câu hỏi siêu cũ này vì nếu bạn đang sử dụng Rails, không cần phải chuyển đổi / phân tích cú pháp nó theo cách mà các câu trả lời khác ở đây yêu cầu bạn làm:
created_at
hoặc updated_at
thuộc tính), bạn có thể gọi trực tiếpiso8601
phương thức trên dấu thời gian đó (ví dụ object.created_at.iso8601
:).iso8601
phương pháp cũng chấp nhận một đối số số để hiển thị chữ số phân đoạn; bạn sẽ sử dụng điều này nếu bạn muốn 2020-04-06T19:16:55.604Z
thay vì 2020-04-06T19:16:55Z
.https://api.rubyonrails.org/v5.2.4/classes/ActiveSupport/TimeWithZone.html#method-i-iso8601