I am using the following gems:
timezone
tzinfo
I am trying to have a newsletter sent at user
's time zone, so that they get the newsletter at their 9:00:00; not 09:00:00 PST where my server is.
I am storing the time zones by name, like "Pacific Time (US & Canada)". Each user has a column user.time_zone
where their specific time zone is stored.
I have built a job
that checks every hour for user
s who could receive the newsletter (i.e. user
s whose local time is 9:00 AM).
class NewsletterTimezoneJob < ActiveJob::Base
def self.perform
users = User.all.gets_newsletter
users.each do |user|
d = Date.current
t = "09:00:00 -0700"
t = t.to_time
newsletter_sendtime = DateTime.new(d.year, d.month, d.day, t.hour, t.min, t.sec, t.zone)
newsletter_sendtime = newsletter_sendtime.to_s
if user.is_in_time_around(newsletter_sendtime)
NewsletterMailer.send_mailer(user, newsletter_sendtime).deliver_later
end
end
end
end
I have built a method on user
that tries to see if the user's local time matches newsletter_sendtime
.
I added a +/- 5 minute window to account for slow servers.
User.rb
:
def is_in_time_around(timeofday)
timeofday = timeofday.to_time
user_zoned = timeofday.in_time_zone(self.time_zone)
user_zoned = user_zoned.strftime("%r").to_time
timeofday = timeofday.strftime("%r").to_time
if user_zoned >= (timeofday - 5.minutes) && user_zoned <= (timeofday + 5.minutes)
true
end
end
This job
and method
should run every hour and send to different users in different time zones each hour; and yet it currently only sends to users in "Pacific Time (US & Canada)," each hour and never sends it to any other `users.