class TwitterCldr::Timezones::Iso8601Location

Constants

FIELDS
FORMATS
UTC

Public Instance Methods

display_name_for(date, fmt) click to toggle source
# File lib/twitter_cldr/timezones/iso8601_location.rb, line 30
def display_name_for(date, fmt)
  offset = tz.period_for_local(date).offset
  offset_secs = offset.utc_offset + offset.std_offset

  case fmt
    when :iso_basic_short
      format_basic_offset(offset_secs, true, true, true)
    when :iso_basic_local_short
      format_basic_offset(offset_secs, false, true, true)
    when :iso_basic_fixed
      format_basic_offset(offset_secs, true, false, true)
    when :iso_basic_local_fixed
      format_basic_offset(offset_secs, false, false, true)
    when :iso_basic_full
      format_basic_offset(offset_secs, true, false, false)
    when :iso_basic_local_full
      format_basic_offset(offset_secs, false, false, false)
    when :iso_extended_fixed
      format_extended_offset(offset_secs, true, false, true)
    when :iso_extended_local_fixed
      format_extended_offset(offset_secs, false, false, true)
    when :iso_extended_full
      format_extended_offset(offset_secs, true, false, false)
    when :iso_extended_local_full
      format_extended_offset(offset_secs, false, false, false)
  end
end

Private Instance Methods

format_basic_offset(offset, use_utc_indicator, is_short, ignore_seconds) click to toggle source
# File lib/twitter_cldr/timezones/iso8601_location.rb, line 60
def format_basic_offset(offset, use_utc_indicator, is_short, ignore_seconds)
  format_offset(offset, true, use_utc_indicator, is_short, ignore_seconds)
end
format_extended_offset(offset, use_utc_indicator, is_short, ignore_seconds) click to toggle source
# File lib/twitter_cldr/timezones/iso8601_location.rb, line 64
def format_extended_offset(offset, use_utc_indicator, is_short, ignore_seconds)
  format_offset(offset, false, use_utc_indicator, is_short, ignore_seconds)
end
format_offset(offset, is_basic, use_utc_indicator, is_short, ignore_seconds) click to toggle source

This was ported from ICU 64.2, TimeZoneFormat.java, formatOffsetISO8601()

# File lib/twitter_cldr/timezones/iso8601_location.rb, line 69
def format_offset(offset, is_basic, use_utc_indicator, is_short, ignore_seconds)
  abs_offset = offset.abs
  return UTC if use_utc_indicator && abs_offset == 0

  min_fields_idx = is_short ? 0 : 1
  max_fields_idx = ignore_seconds ? 1 : 2
  sep = is_basic ? nil : ':'

  fields = []
  fields << abs_offset / 60 / 60
  fields << (abs_offset / 60) % 60
  fields << abs_offset % 60

  last_idx = max_fields_idx

  while last_idx > min_fields_idx
    if fields[last_idx] != 0
      break
    end

    last_idx -= 1
  end

  buf = ''
  sign = '+'

  if offset < 0
    if 0.upto(last_idx).any? { |i| fields[i] != 0 }
      sign = '-';
    end
  end

  buf << sign

  0.upto(last_idx) do |i|
    buf << sep if sep && i != 0
    buf << '0' if fields[i] < 10
    buf << fields[i].to_s
  end

  buf
end