Class: TimeWithZone
- Inherits:
- 
      Object
      
        - Object
- TimeWithZone
 
- Defined in:
- lib/time_with_zone.rb,
 lib/time_with_zone/version.rb
Overview
Handle time with zone withtout ActiveSupport or ENV
require 'time_with_zone'
TimeWithZone.strptime_with_zone('2016-10-10', '%Y-%m-%d', 'Asia/Taipei')
# => '2016-10-10 00:00:00 +0800'
TimeWithZone.parse_with_zone('2016-10-10', 'Asia/Taipei')
# => '2016-10-10 00:00:00 +0800'
time = Time.parse('2016-10-10 00:00:00 +00:00')
TimeWithZone.set_zone(time, 'Asia/Taipei')
# => '2016-10-10 00:00:00 +0800'
time = Time.parse('2016-10-10 00:00:00 +00:00')
TimeWithZone.localtime_with_zone(time, 'Asia/Taipei')
# => '2016-10-10 08:00:00 +0800'
Constant Summary
- NUMERIC_PATTERN =
          [+-]HH:MM, [+-]HHMM, [+-]HH 
- %r{\A[+-]\d\d(:?\d\d)?\z}
- NAME_PATTERN =
          Region/Zone, Region/Zone/Zone 
- %r{\A[^/]+/[^/]+(/[^/]+)?\z}
- ZoneOffset =
          Short-abbreviation timezone which Ruby's Time class supports 
- (class << Time; self; end)::ZoneOffset 
- VERSION =
- "0.3.1"
Class Method Summary (collapse)
- 
  
    
      + (Time) localtime_with_zone(time, timezone) 
    
    
  
  
  
  
  
  
  
  
  
    Time#localtime with timezone (non-destructive). 
- 
  
    
      + (Time) localtime_with_zone!(time, timezone) 
    
    
  
  
  
  
  
  
  
  
  
    Time#localtime with timezone (destructive). 
- 
  
    
      + (Time) parse_with_zone(date, timezone) 
    
    
  
  
  
  
  
  
  
  
  
    Time.parse with timezone. 
- 
  
    
      + (Time) parse_with_zone_offset(date, zone_offset) 
    
    
  
  
  
  
  
  
  
  
  
    Time.parse with zone_offset. 
- 
  
    
      + (Time) set_zone(time, timezone) 
    
    
  
  
  
  
  
  
  
  
  
    This method changes only the zone field of Time object. 
- 
  
    
      + (Time) set_zone_offset(time, zone_offset) 
    
    
  
  
  
  
  
  
  
  
  
    This method changes only the zone offset field of Time object. 
- 
  
    
      + (Time) strptime_with_zone(date, format, timezone) 
    
    
  
  
  
  
  
  
  
  
  
    Time.strptime with timezone. 
- 
  
    
      + (Time) strptime_with_zone_offset(date, format, zone_offset) 
    
    
  
  
  
  
  
  
  
  
  
    Time.strptime with zone_offset. 
- 
  
    
      + (Integer) zone_offset(timezone, time = nil) 
    
    
  
  
  
  
  
  
  
  
  
    Returns zone offset for given timezone string. 
Class Method Details
+ (Time) localtime_with_zone(time, timezone)
Time#localtime with timezone (non-destructive)
ENV['TZ'] = '+09:00' # Assume your local timezone is +09:00
require 'time'
time = Time.parse("2016-10-20 00:00:00 +00:00") 
time.dup.localtime("+08:00")
#=> 2010-10-20 08:00:00 +0800
time.dup.localtime("CDT")
#=> error
time.dup.localtime("Asia/Taipei")
#=> error
require 'time_with_zone'
time = Time.parse("2016-10-20 00:00:00 +00:00") 
TimeWithZone.localtime_with_zone(time, "+08:00")
#=> 2010-10-20 08:00:00 +0800
TimeWithZone.localtime_with_zone(time, "CDT")
#=> 2016-10-19 19:00:00 -0500
TimeWithZone.localtime_with_zone(time, "Asia/Taipei")
#=> 2010-10-20 08:00:00 +0800
This method is actually a short-hand of
require 'time_with_zone'
time = Time.parse("2016-10-20 00:00:00 +00:00")
time.dup.localtime(TimeWithZone.zone_offset("Asia/Taipei", time))
#=> 2010-10-20 08:00:00 +0800
| 69 70 71 | # File 'lib/time_with_zone.rb', line 69 def self.localtime_with_zone(time, timezone) localtime_with_zone!(time.dup, timezone) end | 
+ (Time) localtime_with_zone!(time, timezone)
Time#localtime with timezone (destructive)
| 79 80 81 82 | # File 'lib/time_with_zone.rb', line 79 def self.localtime_with_zone!(time, timezone) _zone_offset = zone_offset(timezone, time) time.localtime(_zone_offset) end | 
+ (Time) parse_with_zone(date, timezone)
Time.parse with timezone
ENV['TZ'] = '+09:00' # Assume your local timezone is +09:00
require 'time'
Time.parse("2016-10-20")
#=> 2016-10-20 00:00:00 +0900
Time.parse("2016-10-20 00:00:00 +08:00")
#=> 2016-10-20 00:00:00 +0800
Time.parse("2016-10-20 00:00:00 CDT")
#=> 2016-10-20 00:00:00 -0500
Time.parse("2016-10-20 00:00:00 Asia/Taipei")
#=> 2016-10-20 00:00:00 +0900 (does not work)
require 'time_with_zone'
TimeWithZone.parse_with_zone("2016-10-20", "+08:00")
#=> 2016-10-20 00:00:00 +0800
TimeWithZone.parse_with_zone("2016-10-20", "CDT")
#=> 2016-10-20 00:00:00 -0500
TimeWithZone.parse_with_zone("2016-10-20", "Asia/Taipei")
#=> 2016-10-20 00:00:00 +0800
| 111 112 113 114 | # File 'lib/time_with_zone.rb', line 111 def self.parse_with_zone(date, timezone) time = Time.parse(date) set_zone!(time, timezone) end | 
+ (Time) parse_with_zone_offset(date, zone_offset)
Time.parse with zone_offset
require 'time_with_zone'
TimeWithZone.parse_with_zone_offset("2016-10-20", 28800)
#=> 2016-10-20 00:00:00 +0800
| 126 127 128 129 | # File 'lib/time_with_zone.rb', line 126 def self.parse_with_zone_offset(date, zone_offset) time = Time.parse(date) set_zone_offset!(time, zone_offset) end | 
+ (Time) set_zone(time, timezone)
This method changes only the zone field of Time object
require 'time_with_zone'
time = Time.parse("2016-02-02 00:00:00 +00:00")
TimeWithZone.set_zone(time, "+08:00")
#=> "2016-02-02 00:00:00 +0800"
# Note that it is not "2016-02-02 08:00:00 +0800" like Time#localtime(timezone)
| 193 194 195 | # File 'lib/time_with_zone.rb', line 193 def self.set_zone(time, timezone) set_zone!(time.dup, timezone) end | 
+ (Time) set_zone_offset(time, zone_offset)
This method changes only the zone offset field of Time object
require 'time_with_zone'
time = Time.parse("2016-02-02 00:00:00 +00:00")
TimeWithZone.set_zone_offset(time, 28800)
#=> "2016-02-02 00:00:00 +0800"
# Note that it is not "2016-02-02 08:00:00 +0800" like Time#localtime(zone_offset)
| 209 210 211 | # File 'lib/time_with_zone.rb', line 209 def self.set_zone_offset(time, zone_offset) set_zone_offset!(time.dup, zone_offset) end | 
+ (Time) strptime_with_zone(date, format, timezone)
Time.strptime with timezone
ENV['TZ'] = '+09:00' # Assume your local timezone is +09:00
require 'time'
Time.strptime("2016-10-20", "%Y-%m-%d")
#=> 2016-10-20 00:00:00 +0900
Time.strptime("2016-10-20 +08:00", "%Y-%m-%d %z")
#=> 2016-10-20 00:00:00 +0800
Time.strptime("2016-10-20 CDT", "%Y-%m-%d %Z")
#=> 2016-10-20 00:00:00 -0500
Time.strptime("2016-10-20 Asia/Taipei", "%Y-%m-%d %Z")
#=> 2016-10-20 00:00:00 +0900 (does not work)
require 'time_with_zone'
TimeWithZone.strptime_with_zone("2016-10-20", "%Y-%m-%d", "+08:00")
#=> 2016-10-20 00:00:00 +0800
TimeWithZone.strptime_with_zone("2016-10-20", "%Y-%m-%d", "CDT")
#=> 2016-10-20 00:00:00 -0500
TimeWithZone.strptime_with_zone("2016-10-20", "%Y-%m-%d", "Asia/Taipei")
#=> 2016-10-20 00:00:00 +0800
| 160 161 162 163 | # File 'lib/time_with_zone.rb', line 160 def self.strptime_with_zone(date, format, timezone) time = Time.strptime(date, format) set_zone!(time, timezone) end | 
+ (Time) strptime_with_zone_offset(date, format, zone_offset)
Time.strptime with zone_offset
require 'time_with_zone'
TimeWithZone.strptime_with_zone_offset("2016-10-20", "%Y-%m-%d", 28800)
#=> 2016-10-20 00:00:00 +0800
| 176 177 178 179 | # File 'lib/time_with_zone.rb', line 176 def self.strptime_with_zone_offset(date, format, zone_offset) time = Time.strptime(date, format) set_zone_offset!(time, zone_offset) end | 
+ (Integer) zone_offset(timezone, time = nil)
Returns zone offset for given timezone string
require 'time_with_zone'
TimeWithZone.zone_offset("+08:00")
#=> 28800
TimeWithZone.zone_offset("Asia/Taipei")
#=> 28800
TimeWithZone.zone_offset("PST")
#=> -28800
TimeWithZone.zone_offset("America/Los_Angeles")
#=> -25200 
TimeWithZone.zone_offset("America/Los_Angeles", Time.parse("2016-07-07 00:00:00 +00:00"))
#=> -25200 # DST (Daylight Saving Time)
TimeWithZone.zone_offset("America/Los_Angeles", Time.parse("2016-01-01 00:00:00 +00:00"))
#=> -28800 # non DST
| 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 | # File 'lib/time_with_zone.rb', line 233 def self.zone_offset(timezone, time = nil) if NUMERIC_PATTERN === timezone Time.zone_offset(timezone) elsif NAME_PATTERN === timezone tz = TZInfo::Timezone.get(timezone) if time tz.period_for_utc(time).utc_total_offset else tz.current_period.utc_total_offset end elsif ZoneOffset.include?(timezone) ZoneOffset[timezone] * 3600 else raise ArgumentError, "timezone format is invalid: #{timezone}" end end |