ฉันมีการประทับเวลาที่อยู่ใน UTC
"2010-10-25 23:48:46 UTC"
ฉันต้องการแปลงเป็น ISO 8601
"2010-10-29 06: 09Z"
เอกสารนั้นสับสนราวกับนรก - วิธีที่ง่ายที่สุดในการทำเช่นนั้นคืออะไร?
ฉันมีการประทับเวลาที่อยู่ใน UTC
"2010-10-25 23:48:46 UTC"
ฉันต้องการแปลงเป็น ISO 8601
"2010-10-29 06: 09Z"
เอกสารนั้นสับสนราวกับนรก - วิธีที่ง่ายที่สุดในการทำเช่นนั้นคืออะไร?
คำตอบ:
ฉันคิดว่าคุณกำลังพยายามหลอกเรา
วันที่เข้ากับคำถามของคุณคือ25 ตุลาคม 2010ขณะที่การส่งออกเป็นวันที่ 29ของการเดือนตุลาคม, ปี 2010 เล่นดี!
ดำเนินการต่อในเธรดการเลือกไนท์นี้: เวลาของคุณก็แตกต่างกันอย่างสิ้นเชิงและคุณพลาดวินาทีจากเวลาที่ส่งออก
ตอนนี้สำหรับคำตอบที่แท้จริง
เล็ก ๆ น้อย ๆ factoid แรกแม้ว่า: การส่งออกมาตรฐาน ISO 8601 ในทับทิมมีความคล้ายคลึงกับ "วันที่และเวลารวม" เอาท์พุทจากISO 8601 หน้าวิกิพีเดีย
คุณได้มีสตริงและเพื่อให้คุณจะต้องแปลงเป็นวัตถุที่คุณสามารถทำอะไรกับTime
to_time
จากนั้นก็เป็นเพียงเรื่องของการเรียกร้องiso8601
ให้วัตถุนั้นรับเวอร์ชัน ISO 8601:
"2010-10-25 23:48:46 UTC".to_time.iso8601
to_time
วิธีคือมารยาทของทางรถไฟในขณะที่iso8601
เป็นมารยาทของไลบรารีมาตรฐานของรูบี้
หลังจากการทดลองหลายครั้งฉันพบว่าตัวแยกวิเคราะห์ของไลบรารีเวลาดีกว่า DateTime แม้ว่าเหตุผลจะหนีฉันไปในขณะนี้ก็ตาม ด้วยข้อแม้นั้นฉันมักจะใช้ Time แทนที่จะเป็น DateTime สำหรับสิ่งประเภทนี้และเอกสารทับทิมก็ยากที่จะเข้าใจว่าทำไมถึงเป็นเช่นนั้น
require 'time'
puts Time.parse("2010-10-25 23:48:46 UTC").iso8601
"2010-10-25T23:48:46Z"
Time.parse("...").utc.iso8601
otherwize คุณจะได้รับเวลาที่ต่อท้ายด้วย+03:00
หรือค่าอื่น ๆ ขึ้นอยู่กับเขตเวลาดั้งเดิมที่กำหนดด้วย ฉันหมายถึงแทนZ
.
หมายเหตุ: คุณต้องแปลง (แยกวิเคราะห์) สตริงเวลาเป็นวัตถุเวลาก่อนจึงจะสามารถใช้เมธอด 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
ขั้นตอนที่ถูกต้อง:
irb> ut = DateTime.parse("2010-10-25 23:48:46 UTC")
irb> ut.iso8601
=> "2010-10-25T23:48:46+00:00"
การเพิ่มคำตอบให้กับคำถามเก่าสุด ๆ นี้เพราะหากคุณใช้ Rails ไม่จำเป็นต้องแปลง / แยกวิเคราะห์ด้วยวิธีที่คำตอบอื่น ๆ ที่นี่บอกให้คุณทำ:
created_at
หรือupdated_at
แอตทริบิวต์) คุณสามารถเรียกใช้เมธอดในการประทับเวลานั้นได้โดยตรงiso8601
(เช่นobject.created_at.iso8601
)iso8601
วิธียังยอมรับอาร์กิวเมนต์ที่เป็นตัวเลขจะแสดงตัวเลขที่เป็นเศษ; คุณจะใช้นี้ถ้าคุณต้องการแทน2020-04-06T19:16:55.604Z
2020-04-06T19:16:55Z
https://api.rubyonrails.org/v5.2.4/classes/ActiveSupport/TimeWithZone.html#method-i-iso8601