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

#aliasesArray

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

Returns:

  • (Array)

    A list of aliases for this timezone



395
396
397
398
# File 'lib/lazier/datetime.rb', line 395

def aliases
  reference = self.class::MAPPING.fetch(name, name).gsub("_", " ")
  @aliases ||= ([reference] + self.class::MAPPING.collect { |name, zone| format_alias(name, zone, reference) }).uniq.compact.sort
end

#current_aliasString

Returns the current alias for this timezone.

Returns:

  • (String)

    The current alias or the first alias of the current timezone.



414
415
416
417
418
419
420
421
422
423
424
# File 'lib/lazier/datetime.rb', line 414

def current_alias
  identifier = tzinfo.identifier

  catch(:alias) do
    aliases.each do |a|
      throw(:alias, a) if a == identifier
    end

    aliases.first
  end
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.



405
406
407
408
409
# File 'lib/lazier/datetime.rb', line 405

def current_offset(rational = false, date = nil)
  date ||= ::DateTime.now
  rv = (period_for_utc(date.utc).dst? ? dst_offset : 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.



466
467
468
# File 'lib/lazier/datetime.rb', line 466

def dst_correction(rational = false, year = nil)
  dst_offset(rational, year, :std_offset)
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.



488
489
490
# File 'lib/lazier/datetime.rb', line 488

def dst_name(dst_label = nil, year = nil, name = nil)
  uses_dst?(year) ? "#{name || self.name} #{dst_label || "(DST)"}" : nil
end

#dst_offset(rational = false, year = nil, method = :utc_total_offset) ⇒ 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.

  • method (Symbol) (defaults to: :utc_total_offset)

    The method to use for getting the offset. Default is total offset from UTC.

Returns:

  • (Fixnum|Rational)

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



476
477
478
479
480
# File 'lib/lazier/datetime.rb', line 476

def dst_offset(rational = false, year = nil, method = :utc_total_offset)
  period = dst_period(year)
  rv = period ? period.send(method) : 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.



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

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

  northern_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 Southern Hemisphere.

  period = self.period_for_utc(northern_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.



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

def offset(rational = false)
  rational ? self.class.rationalize_offset(utc_offset) : utc_offset
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.



497
498
499
# File 'lib/lazier/datetime.rb', line 497

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

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

Returns a parameterized 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 parameterized string representation for this zone.



516
517
518
# File 'lib/lazier/datetime.rb', line 516

def to_str_parameterized(with_offset = true, name = nil)
  ::ActiveSupport::TimeZone.parameterize_zone(name || 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.



507
508
509
# File 'lib/lazier/datetime.rb', line 507

def to_str_with_dst(dst_label = nil, year = nil, name = nil)
  self.uses_dst?(year) ? "(GMT#{self.class.seconds_to_utc_offset(dst_period(year).utc_total_offset)}) #{name || current_alias} #{dst_label || "(DST)"}" : nil
end

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

Returns a parameterized 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 parameterized string representation for this zone with DST or nil, if the timezone doesn't use DST for that year.



526
527
528
529
# File 'lib/lazier/datetime.rb', line 526

def to_str_with_dst_parameterized(dst_label = nil, year = nil, name = nil)
  rv = 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.



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

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