ruby-on-rails - حسوب - تعلم لغة روبي




روبي على القضبان والسجلات النشطة سجل مستقل نختلف على قيم قاعدة البيانات ل: الطوابع الزمنية (3)

لقد نشرت سؤالا في وقت سابق اليوم عندما لم أكن صادرا تماما في هذه المسألة حتى الآن. سأكون قادرا على أن تكون أكثر إيجازا هنا.

أنا تشغيل رور 2.1.2، على ويندوز، مع الخلية. المنطقة الزمنية الأصلية ملقم سكل هو أوتك. التوقيت المحلي هو المحيط الهادئ (-0800)

لدي نموذج مع: العمود نوع الطابع الزمني التي يمكن أن تفعل أشياء من هذا القبيل مع:

record = Record.find(:first)
record.the_time = Time.now()

عندما أفعل "حدد * من السجلات" في قاعدة البيانات، والوقت هو عرض ثماني ساعات في وقت مبكر من بلدي بالتوقيت المحلي، وهو الصحيح، بالنظر إلى أن دب على أوتك. (لقد تحققت من أنه 'التفكير في أوتك' مع بسيطة 'حدد الآن ()' و 'حدد utc_timestamp ()')

هذا هو المكان الذي تبدأ فيه المشكلة. إذا عرضت الوقت في طريقة عرض:

<%= h record.the_time %>

... ثم أعود الوقت الصحيح، عرض بتنسيق أوتك. إذا كتبت إلى قاعدة البيانات في الساعة 16:40:00 بالتوقيت المحلي، وأظهرت قاعدة البيانات 00:40:00.

ومع ذلك، إذا كنت تشغيل برنامج نصي مستقل:

record = Record.find(:first)
puts record.the_time

... ثم أعود مرة أوتك التي قمت بتخزينها في قاعدة البيانات (00:40:00،) ولكن مع التوقيت المحلي:

Wed Nov 26 00:40:00 (-0800) 2008

... ثماني ساعات تشوه الوقت. لماذا هو أن تخزين الوقت يترجم بشكل صحيح، ولكن استرجاعها لا؟ إذا قارنت الوقت المخزن من الماضي القريب في دب ومقارنتها مع الوقت الحالي، والوقت الحالي هو أقل - تقول لي هذه ليست مجرد قضية تحويل سلسلة.

أيه أفكار؟


حسنا، لم تعلق على اقتراحي الأخير لإعادة تشغيل الخادم أو وحدة التحكم الخاصة بك.

كان لي مشكلة مماثلة وحصلت ثابتة عندما فعلت ذلك.

كما يمكنك ذكر البرنامج النصي مستقل، ولكن من أجل الحصول على ميزة المنطقة الزمنية من القضبان رمز يحتاج لتشغيل داخل القضبان.


هناك إعداد في كونفيغ / environment.rb الذي يحدد time_zone. ربما هذا لم يتم تعيين نفسه في السيناريو الخاص بك:

# Make Time.zone default to the specified zone, and make Active Record store time values
# in the database in UTC, and return them converted to the specified local zone.
# Run "rake -D time" for a list of tasks for finding time zone names. Uncomment to use default local time.
config.time_zone = 'UTC'

يمكنك أيضا محاولة تحديد تس وتنسيق بشكل صريح:

require 'active_support/core_ext/date/conversions'
record.the_time.utc.to_s(:db) 

(أو الغش والاستيلاء على جزء شفرة من هناك إذا كنت لا تستخدم نشط_support في البرنامج النصي مستقل)


في النهاية، كان من الأسهل بكثير القيام بذلك عن طريق تخزين الأوقات باعتبارها عدد صحيح (Time.now () to_i ()) وتحويلها مرة أخرى إلى الوقت الذي كنت في حاجة لعرضها (Time.at (the_time_the_database_returned_to_me).) هذا هو بالكاد الحل الأفضل، لكنه كان الوحيد الذي عمل.





timezone