Module: Lazier::TimeZone

Extended by:
ActiveSupport::Concern
Defined in:
lib/lazier/datetime.rb

Overview

Extensions for timezone objects.

Defined Under Namespace

Modules: ClassMethods

Instance Method Summary collapse

Instance Method Details

#aliases(dst_label = nil) ⇒ Array

Returns a list of valid aliases (city names) for this timezone (basing on offset).

Parameters:

  • dst_label (String) (defaults to: nil)

    Label for the DST indication. Defaults to (DST).

Returns:

  • (Array)

    A list of aliases for this timezone



388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
# File 'lib/lazier/datetime.rb', line 388

def aliases(dst_label = nil)
  reference = self.name
  reference = self.class::MAPPING[self.name] if self.class::MAPPING.has_key?(self.name) # We are an alias
  reference = reference.gsub("_", " ")

  if @aliases.blank? then
    # First we search for aliases by name
    @aliases = [reference]

    self.class::MAPPING.each do |name, zone|
      if zone.gsub("_", " ") == reference then
        if name == "International Date Line West" || name == "UTC" || name.include?("(US & Canada)")
          @aliases << name
        else
          @aliases << reference.gsub(/\/.*/, "/" + name)
        end
      end
    end

    @aliases = @aliases.uniq.compact.sort
  end

  @aliases
end

#current_offset(rational = false, date = nil) ⇒ Fixnum|Rational

Returns the current offset for this timezone, taking care of Daylight Saving Time (DST).

Parameters:

  • rational (Boolean) (defaults to: false)

    If to return the offset as a Rational.

  • date (DateTime) (defaults to: nil)

    The date to consider. Defaults to now.

Returns:

  • (Fixnum|Rational)

    The offset of this timezone.



418
419
420
421
422
423
424
425
# File 'lib/lazier/datetime.rb', line 418

def current_offset(rational = false, date = nil)
  date ||= ::DateTime.now

  dst_period = self.dst_period

  rv = (self.period_for_utc(date.utc).dst? ? self.dst_offset : self.offset)
  rational ? self.class.rationalize_offset(rv) : rv
end

#dst_correction(rational = false, year = nil) ⇒ Fixnum|Rational

Return the correction applied to the standard offset the timezone when the Daylight Saving Time (DST) is active.

Parameters:

  • rational (Boolean) (defaults to: false)

    If to return the offset as a Rational.

  • year (Fixnum) (defaults to: nil)

    The year to which refer to. Defaults to the current year.

Returns:

  • (Fixnum|Rational)

    The correction for dst.



468
469
470
471
472
# File 'lib/lazier/datetime.rb', line 468

def dst_correction(rational = false, year = nil)
  period = self.dst_period(year)
  rv = period ? period.std_offset : 0
  rational ? self.class.rationalize_offset(rv) : rv
end

#dst_name(dst_label = nil, year = nil, name = nil) ⇒ String

Returns the name for this zone with Daylight Saving Time (DST) active.

Parameters:

  • dst_label (String) (defaults to: nil)

    Label for the DST indication. Defaults to (DST).

  • year (Fixnum) (defaults to: nil)

    The year to which refer to. Defaults to the current year.

  • name (String) (defaults to: nil)

    The name to use for this zone. Defaults to the zone name.

Returns:

  • (String)

    The name for the zone with DST or nil, if the timezone doesn't use DST for that year.



491
492
493
494
495
496
# File 'lib/lazier/datetime.rb', line 491

def dst_name(dst_label = nil, year = nil, name = nil)
  dst_label ||= "(DST)"
  name ||= self.name

  self.uses_dst?(year) ? "#{name} #{dst_label}" : nil
end

#dst_offset(rational = false, year = nil) ⇒ Fixnum|Rational

Returns the standard offset for this timezone timezone when the Daylight Saving Time (DST) is active.

Parameters:

  • rational (Boolean) (defaults to: false)

    If to return the offset as a Rational.

  • year (Fixnum) (defaults to: nil)

    The year to which refer to. Defaults to the current year.

Returns:

  • (Fixnum|Rational)

    The DST offset for this timezone or 0, if the timezone doesn't use DST for that year.



479
480
481
482
483
# File 'lib/lazier/datetime.rb', line 479

def dst_offset(rational = false, year = nil)
  period = self.dst_period(year)
  rv = period ? period.utc_total_offset : 0
  rational ? self.class.rationalize_offset(rv) : rv
end

#dst_period(year = nil) ⇒ TimezonePeriod

Gets a period for this timezone when the Daylight Saving Time (DST) is active (it takes care of different hemispheres).

Parameters:

  • year (Fixnum) (defaults to: nil)

    The year to which refer to. Defaults to the current year.

Returns:

  • (TimezonePeriod)

    A period when the Daylight Saving Time (DST) is active or nil if the timezone doesn't use DST for that year.



440
441
442
443
444
445
446
447
448
449
# File 'lib/lazier/datetime.rb', line 440

def dst_period(year = nil)
  year ||= ::Date.today.year

  nothern_summer = ::DateTime.civil(year, 7, 15).utc # This is a representation of a summer period in the Northern Hemisphere.
  southern_summer = ::DateTime.civil(year, 1, 15).utc # This is a representation of a summer period in the Northern Hemisphere.

  period = self.period_for_utc(nothern_summer)
  period = self.period_for_utc(southern_summer) if !period.dst?
  period.dst? ? period : nil
end

#offset(rational = false) ⇒ Fixnum|Rational

Returns the standard offset for this timezone.

Parameters:

  • rational (Boolean) (defaults to: false)

    If to return the offset as a Rational.

Returns:

  • (Fixnum|Rational)

    The offset of this timezone.



431
432
433
434
# File 'lib/lazier/datetime.rb', line 431

def offset(rational = false)
  rv = self.utc_offset
  rational ? self.class.rationalize_offset(rv) : rv
end

#to_str(name = nil, colon = true) ⇒ String

Returns the name for this zone with Daylight Saving Time (DST) active.

Parameters:

  • name (String) (defaults to: nil)

    The name to use for this zone. Defaults to the zone name.

  • colon (Boolean) (defaults to: true)

    If to put the colon in the output string.

Returns:

  • (String)

    The name for this zone.



503
504
505
506
# File 'lib/lazier/datetime.rb', line 503

def to_str(name = nil, colon = true)
  name ||= self.aliases.first
  "(GMT#{self.formatted_offset(colon)}) #{name}"
end

#to_str_parameterized(with_offset = true, name = nil) ⇒ String

Returns a parametized string representation for this zone.

Parameters:

  • with_offset (Boolean) (defaults to: true)

    If to include offset into the representation.

  • name (String) (defaults to: nil)

    The name to use for this zone. Defaults to the zone name.

Returns:

  • (String)

    The parametized string representation for this zone.



532
533
534
# File 'lib/lazier/datetime.rb', line 532

def to_str_parameterized(with_offset = true, name = nil)
  ::ActiveSupport::TimeZone.parameterize_zone(name || self.to_str, with_offset)
end

#to_str_with_dst(dst_label = nil, year = nil, name = nil) ⇒ String

Returns a string representation for this zone with Daylight Saving Time (DST) active.

Parameters:

  • dst_label (String) (defaults to: nil)

    Label for the DST indication. Defaults to (DST).

  • year (Fixnum) (defaults to: nil)

    The year to which refer to. Defaults to the current year.

  • name (String) (defaults to: nil)

    The name to use for this zone. Defaults to the zone name.

Returns:

  • (String)

    The string representation for the zone with DST or nil, if the timezone doesn't use DST for that year.



514
515
516
517
518
519
520
521
522
523
524
525
# File 'lib/lazier/datetime.rb', line 514

def to_str_with_dst(dst_label = nil, year = nil, name = nil)
  dst_label ||= "(DST)"
  name ||= self.aliases.first

  if self.uses_dst?(year) then
    period = self.dst_period(year)
    offset = self.class.seconds_to_utc_offset(period.utc_total_offset)
    "(GMT#{offset}) #{name} #{dst_label}"
  else
    nil
  end
end

#to_str_with_dst_parameterized(dst_label = nil, with_offset = true, year = nil, name = nil) ⇒ String

Returns a parametized string representation for this zone with Daylight Saving Time (DST) active.

Parameters:

  • dst_label (String) (defaults to: nil)

    Label for the DST indication. Defaults to (DST).

  • with_offset (Boolean) (defaults to: true)

    If to include offset into the representation.

  • year (Fixnum) (defaults to: nil)

    The year to which refer to. Defaults to the current year.

  • name (String) (defaults to: nil)

    The name to use for this zone. Defaults to the zone name.

Returns:

  • (String)

    The parametized string representation for this zone with DST or nil, if the timezone doesn't use DST for that year.



543
544
545
546
# File 'lib/lazier/datetime.rb', line 543

def to_str_with_dst_parameterized(dst_label = nil, with_offset = true, year = nil, name = nil)
  rv = self.to_str_with_dst(dst_label, year, name)
  rv ? ::ActiveSupport::TimeZone.parameterize_zone(rv) : nil
end

#uses_dst?(reference = nil) ⇒ Boolean

Checks if the timezone uses Daylight Saving Time (DST) for that date or year.

Parameters:

  • reference (Object) (defaults to: nil)

    The date or year to check. Defaults to the current year.

Returns:

  • (Boolean)

    true if the zone uses DST for that date or year, false otherwise.



455
456
457
458
459
460
461
# File 'lib/lazier/datetime.rb', line 455

def uses_dst?(reference = nil)
  if reference.respond_to?(:year) && reference.respond_to?(:utc) then # This is a date like object
    self.dst_period(reference.year).present? && self.period_for_utc(reference.utc).dst?
  else
    self.dst_period(reference).present?
  end
end