Ruby / Rails: แปลง Date เป็น UNIX Timestamp


202

ฉันจะรับการประทับเวลา UNIX ได้อย่างไร (จำนวนวินาทีตั้งแต่ 1970 GMT) จากอ็อบเจกต์ Date ในแอพ Rails

ฉันรู้ว่าTime#to_iส่งคืนการประทับเวลา แต่การทำDate#to_timeและจากนั้นรับผลลัพธ์การประทับเวลาในบางสิ่งที่ปิดประมาณหนึ่งเดือน (ไม่แน่ใจว่าทำไม ... )

ความช่วยเหลือใด ๆ ที่ชื่นชมขอบคุณ!

แก้ไข: ตกลงฉันคิดว่าฉันคิดว่าฉันกำลังประมวลผลวันที่หลายครั้งในวงและแต่ละครั้งที่วันที่ถูกย้ายเล็กน้อยเพราะโซนเวลาไม่ตรงกันในที่สุดนำไปสู่การประทับเวลาของฉันเป็นเดือนออก Date#to_timeแต่ฉันก็ยังจะให้ความสนใจในการรู้ว่ามีวิธีการทำเช่นนี้โดยไม่ต้องอาศัยใด ๆ

คำตอบ:


350

รหัสdate.to_time.to_iควรปรับการทำงาน เซสชันคอนโซล Rails ด้านล่างแสดงตัวอย่าง:

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

โปรดทราบว่าวัตถุ DateTime ระดับกลางอยู่ในเวลาท้องถิ่นดังนั้นการประทับเวลาอาจใช้เวลาหลายชั่วโมงจากสิ่งที่คุณคาดหวัง หากคุณต้องการทำงานในเวลา UTC คุณสามารถใช้วิธีการของ DateTime "to_utc"


3
DateTime ไม่มีto_utc
Green

12
date.to_time.utcอาจเป็นสิ่งที่เขาหมายถึง
Adam Eberlin

3
ใน Rails ผ่าน ActiveSupport อินสแตนซ์ DateTime จะมีวิธี utc () (หรือใช้นามแฝงเป็น getutc)
Gokul

71

ฉันได้รับสิ่งต่อไปนี้เมื่อฉันลอง:

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

ความแตกต่างระหว่างตัวเลขทั้งสองนี้เป็นเพราะความจริงที่Dateไม่ได้เก็บชั่วโมงนาทีหรือวินาทีของเวลาปัจจุบัน การแปลง a เป็นDatea Timeจะทำให้ในวันนั้นเที่ยงคืน


9

ตัวเลือกที่แนะนำในการใช้to_utcหรือutcแก้ไขการชดเชยเวลาท้องถิ่นไม่ทำงาน สำหรับฉันฉันพบว่าการใช้Time.utc()งานถูกต้องและรหัสเกี่ยวข้องกับขั้นตอนน้อยลง:

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

VS

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

นี่คือสิ่งที่เกิดขึ้นเมื่อคุณโทร utc หลังจากใช้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

... ดังนั้นการโทรอย่างชัดเจนto_iจะให้เวลาที่ไม่ถูกต้อง


8

โซลูชันสำหรับ Ruby 1.8 เมื่อคุณมีวัตถุ DateTime ตามอำเภอใจ:

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

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