1

さまざまなユーザーに代わって電子メールを受信するアプリケーションがあり、これらのユーザーの受信トレイ ( Mailgem を使用して IMAP を介して取得) にはさまざまなタイムゾーンがあります。例えば:

Loading development environment (Rails 3.2.12)
2.0.0-p247 :001 > first = Email.all[0].datetime
 => Mon, 04 Feb 2013 07:05:28 +0000
2.0.0-p247 :002 > second = Email.all[1].datetime
 => Wed, 21 Aug 2013 11:54:49 +0200 

私のアプリケーションのユーザーはさまざまなタイムゾーンにいるため、それぞれのタイムゾーンを示すデータベース フィールドがあります。これは、例えば"+0000"、または"-0500". 元のタイムゾーンを傍受し、時間をユーザーのタイムゾーンに変換するコードが必要です。

例えば:

class User
  include Mongoid::Document
  field :timezone, :type => String, :default => "+0200"
  has_many :emails, :inverse_of => :user
end

class Email
  include Mongoid::Document
  field :datetime, :type => DateTime
  belongs_to :user, :inverse_of => :emails
end


Loading development environment (Rails 3.2.12)
2.0.0-p247 :001 > email = User.first.emails.first
 => #<Email ... >
2.0.0-p247 :002 > datetime = email.datetime
 => Mon, 04 Feb 2013 07:05:28 +0000
2.0.0-p247 :003 > email.update_attribute(datetime: datetime.convert_zone(datetime.zone, user.timezone)  # => convert_zone is not an actual method, so what should I put in here?
 => Mon, 04 Feb 2013 09:05:28 +0200
4

1 に答える 1

1

ActiveSupport のin_time_zone方法でタイム ゾーンを変更できます。

email.datetime.in_time_zone(ActiveSupport::TimeZone.new(user.timezone))

これがパフォーマンスの問題でない限り、データベースの日時がユーザーのタイムゾーンにあることに依存しません。たとえば、ユーザーが自分のタイム ゾーンを変更した場合はどうなるでしょうか。彼のすべてのメールなどのタイムスタンプを再計算する必要があります。今のところ、メールを表示するときにゾーンを変更することをお勧めします。

于 2013-08-22T12:16:04.663 に答える