روبي / القضبان:تحويل التاريخ إلى طابع زمني UNIX
-
05-07-2019 - |
سؤال
كيف يمكنني الحصول على طابع زمني لـ UNIX (عدد الثواني منذ الساعة 1970 بتوقيت جرينتش) من كائن Date في تطبيق Rails؟
أنا أعرف Time#to_i
إرجاع الطابع الزمني، ولكن القيام به Date#to_time
ثم الحصول على نتائج الطابع الزمني لشيء متوقف لمدة شهر تقريبًا (لست متأكدًا من السبب ...).
نقدر اي مساعدة، شكرا!
يحرر:حسنًا، أعتقد أنني اكتشفت الأمر - كنت أقوم بمعالجة تاريخ عدة مرات في حلقة، وفي كل مرة يتم نقل التاريخ قليلاً بسبب عدم تطابق المنطقة الزمنية، مما يؤدي في النهاية إلى توقف الطابع الزمني الخاص بي لمدة شهر.ومع ذلك، سأكون مهتمًا بمعرفة ما إذا كانت هناك أي طريقة للقيام بذلك دون الاعتماد عليها Date#to_time
.
المحلول
الرمز 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".
نصائح أخرى
وأحصل على ما يلي عندما أحاول ذلك:
>> Date.today.to_time.to_i
=> 1259244000
>> Time.now.to_i
=> 1259275709
ويرجع ذلك إلى حقيقة أن Date
لا تخزن الساعات والدقائق أو الثواني من الوقت الحالي والفرق بين هذين الرقمين. سوف تحويل Date
إلى Time
ينتج في ذلك اليوم منتصف الليل.
والحل لروبي 1.8 عندما يكون لديك كائن التاريخ والوقت التعسفي:
1.8.7-p374 :001 > require 'date'
=> true
1.8.7-p374 :002 > DateTime.new(2012, 1, 15).strftime('%s')
=> "1326585600"
والخيارات المقترحة لاستخدام to_utc
أو utc
لإصلاح بالتوقيت المحلي تعويض لا يعمل. بالنسبة لي لقد وجدت باستخدام Time.utc()
عملت بشكل صحيح ورمز ينطوي على خطوات أقل:
> Time.utc(2016, 12, 25).to_i
=> 1482624000 # correct
ومقابل
> Date.new(2016, 12, 25).to_time.utc.to_i
=> 1482584400 # incorrect
وهنا هو ما يحدث عند استدعاء بالتوقيت العالمي بعد استخدام 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
سوف تعطي الطابع الزمني الخطأ.
DateTime.new(2012, 1, 15).to_time.to_i