วิธีรับ UTC timestamp ใน Ruby


คำตอบ:


117
time = Time.now.getutc

เหตุผล:ในสายตาของฉันเวลาที่แน่นอนคือ: จุดในเวลา สิ่งนี้สามารถแสดงได้อย่างถูกต้องกับวัตถุ หากคุณต้องการสิ่งอื่นใดค่าสเกลาร์เช่นวินาทีตั้งแต่ช่วงเวลา Unix epoch ช่วง 100-ns ตั้งแต่ปี 1601 หรืออาจเป็นสตริงสำหรับจุดประสงค์ในการแสดงหรือจัดเก็บการประทับเวลาในฐานข้อมูลคุณสามารถรับสิ่งนั้นได้จากวัตถุ แต่นั่นก็ขึ้นอยู่กับการใช้งานของคุณ

การบอกว่า»การประทับเวลาที่แท้จริงคือจำนวนวินาทีตั้งแต่ยุคที่ Unix หายไปเล็กน้อยเนื่องจากเป็นวิธีหนึ่งในการแทนจุดในเวลาหนึ่ง แต่ยังต้องการข้อมูลเพิ่มเติมเพื่อให้รู้ว่าคุณกำลังติดต่อด้วย เวลาและไม่ใช่ตัวเลข Timeวัตถุแก้ปัญหานี้ได้เป็นอย่างดีโดยเป็นตัวแทนของจุดในเวลาและยังเป็นที่ชัดเจนเกี่ยวกับสิ่งที่มันเป็น


93
ที่ช่วยให้วัตถุเวลาที่คุณควร Time.now.to_i สำหรับการประทับเวลาจริง
rafamvc

3
ใน opninion ของฉันวัตถุมีเวลาเพียงพอและคุณยังมีอิสระทั้งหมดที่คุณต้องการ การลดค่าเป็นเซนต์คิตส์และเนวิสในกรณีส่วนใหญ่ไม่จำเป็นจริงๆ
Joey

2
การประทับเวลานั้นสัมพันธ์กับยุค - ไม่สำคัญว่าคุณจะเข้าสู่เขตเวลาใดคำตอบของ manzhikov นั้นดีกว่า
Ryan Mohr

2
ในขณะที่คำอธิบายที่ดีว่าทำไมถึงไม่ใช้การประทับเวลา unix สิ่งนี้ไม่ตอบคำถาม OP (หรือคำถามเดียวกันกับที่ฉันพบเมื่อโพสต์นี้) ต้องใช้การประทับเวลา Unix ในหลายกรณี (เช่นสำหรับ API) แม้หลังจากคำอธิบายคำตอบนี้ไม่ได้ให้วิธีการที่แท้จริงในการรับการประทับเวลา
stuckj

5
@ stuckj ณ จุดไม่มีคำถามกล่าวถึง Unix timestamp ฉันเพียงแค่ยังได้รับ downvotes สำหรับคำตอบนี้เพราะคนดูเหมือนจะคิดว่า» timestamp == เวลา Unix «ดังนั้นคำอธิบาย
Joey

247

คุณสามารถใช้: Time.now.to_i.


1
การใช้ Time.now.getutc.to_i จะเหมาะสมกว่านี้ไหม หรือว่าเป็นหลักเทียบเท่า
28991 ติดอยู่

20
การประทับเวลาจะเหมือนกันในทุกเขตเวลา :)
manzhikov

2
โอ้ใช่แล้ว คำถามระดมสมอง :)
stuckj

นี่คือการตอบสนองที่เหมาะสมที่สุด!
Darlan Dieterich

46

การจัดรูปแบบเริ่มต้นไม่มีประโยชน์มากในความคิดของฉัน ฉันชอบ ISO8601 เนื่องจากสามารถจัดเรียงได้ค่อนข้างกะทัดรัดและเป็นที่ยอมรับอย่างกว้างขวาง:

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

1
โปรดทราบว่าวิธีนี้มาจาก ActiveSupport ไม่ใช่ในไลบรารีมาตรฐานrubydoc.info/docs/rails/ActiveSupport%2FTimeWithZone:iso8601
n0nick

3
@ n0nick คุณแน่ใจหรือแม้แต่ใน 2.0? ฉันรู้ว่าฉันได้ใช้มันใน "วานิลลา" การติดตั้งโดยไม่ต้องราง ฯลฯ /usr/share/ruby/2.0/time.rbและมันอยู่ใน
ทิมซิลเวสเตอร์

15

โดยทั่วไปการประทับเวลาไม่มีเขตเวลา

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

1
to_fจะดีกว่า
xis

1
ขึ้นอยู่กับสถานการณ์
Yuki Matsukura

1
เมื่อไม่ประทับเวลามีเขตเวลาหรือไม่?
Dennis

1
การประทับเวลาไม่เกี่ยวข้องกับเขตเวลา กล่าวอีกนัยหนึ่งการประทับเวลาคือ UTC
Yuki Matsukura

1
@ YukiMatsukura ที่จริงแล้วมันไม่แม่นยำเลย การประทับเวลาไม่ได้แสดงถึงเขตเวลาใด ๆ ดังนั้น "การประทับเวลาคือ UTC" จึงเป็นจริงเช่นเดียวกับ "การประทับเวลาคือช้างเซ่อ" ปัญหาอยู่ในการแสดง devs ส่วนใหญ่แสดงว่าเป็นการประทับเวลา Unix (ซึ่งไม่ได้ระบุ UTC หรือเขตเวลาอื่นใดเนื่องจากเป็นเพียงค่าจำนวนเต็ม)
Pellmeister

10

หากคุณต้องการเวลาประทับที่มนุษย์อ่านได้ (เช่นการโยกย้ายรางรถไฟ) " 20190527141340 "

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

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

7

สิ่งที่ดีคือการประทับเวลาด้วยความละเอียดที่กำหนดในไม่กี่วินาที? Time.now.to_fผมพบว่ามันมีการปฏิบัติมากขึ้นกับการทำงานกับ Heck คุณอาจโยนto_s.sub('.','')ที่จะได้รับการกำจัดของจุดทศนิยมหรือดำเนิน typecast Integer(1e6*Time.now.to_f)เช่นนี้:


ขอบคุณ ฉันใช้สิ่งนี้: Integer(1e3*Time.now.to_f)เพื่อให้การประทับเวลาฝั่งเซิร์ฟเวอร์ของฉันเหมือนกับ javascript ฝั่งไคลเอ็นต์Date.now()
joshweir


-2

time = Time.zone.now()

มันจะทำงานเป็น

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

โจนาธานคุณบอกฉันได้มั้ยว่ามีอะไรผิดปกติในคำตอบนี้?
เครื่องหมายดอกจัน

1
ขึ้นอยู่กับสิ่งที่ทับทิมเป็นเขตเวลาท้องถิ่น มันจะทำงานได้ตามที่คาดหวังเฉพาะในกรณีที่ TZ ในพื้นที่เป็น UTC
MasterCheffinator

-6

วิธีที่เหมาะสมคือการทำTime.now.getutc.to_iเพื่อให้ได้จำนวนเวลาที่เหมาะสมเนื่องจากการแสดงจำนวนเต็มไม่จำเป็นต้องเหมือนกันกับการประทับเวลา utc เสมอเนื่องจากความแตกต่างของเขตเวลา


7
ทุกคนพูดอย่างนั้นทำไมต้องทำสำเนาโดยไม่มีข้อมูลใหม่สาย 3 ปี
Kaspar Lee

2
และไม่มีเครื่องหมายวรรคตอนที่จะทำให้ 1 ประโยคซึ่งยาวเกินไปและไม่ถูกต้องชัดเจนขึ้น
Emile Vrijdags
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.