Skip to content

Instantly share code, notes, and snippets.

@VishalTaj
Last active September 24, 2022 08:25
Show Gist options
  • Save VishalTaj/6c64936e8e069ef9c648ac76077ef8dd to your computer and use it in GitHub Desktop.
Save VishalTaj/6c64936e8e069ef9c648ac76077ef8dd to your computer and use it in GitHub Desktop.
Convert Rails timezone based on browser.
module TzConcern
extend ActiveSupport::Concern
included do
before_action :set_timezone
end
private
def set_timezone
min = request.cookies["app_timezone"] || -480 # if nil set offset of malaysia
TZConverter.timezone = ActiveSupport::TimeZone[-min.to_i.minutes].try(:name)
end
end
module TZConverter
thread_mattr_accessor :timezone
end
TZConverter.timezone = 'UTC'
module Date::TimezoneConverter
def in_tz timezone=nil
timezone ||= TZConverter.timezone
timezone = timezone.nil? ? "Kuala Lumpur" : timezone
self.try(:in_time_zone, timezone)
end
def to_tz format="%I:%M %p"
in_tz.try(:strftime, format)
end
def minutes_since_midnight
(self.hour * 3600 + self.min * 60) / 60
end
end
module String::TimezoneConverter
def to_utc
timezone = TZConverter.timezone.nil? ? "Kuala Lumpur" : TZConverter.timezone
ActiveSupport::TimeZone[timezone].parse(self)
end
end
module Integer::TimezoneConverter
def to_time meridian: false
time = "%02d:%02d" % [self/60%60, self%60]
meridian.present? ? Time.parse(time).strftime("%I:%M %p") : time
end
end
DateTime.include Date::TimezoneConverter
Time.include Date::TimezoneConverter
String.include String::TimezoneConverter
Integer.include Integer::TimezoneConverter
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment