سؤال

كيف يمكنني الحصول على طابع زمني لـ 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top