Class: Puppet::Pops::Time::Timestamp

Inherits:
TimeData show all
Defined in:
lib/puppet/pops/time/timestamp.rb

Constant Summary collapse

DEFAULT_FORMATS_WO_TZ =
['%FT%T.%N', '%FT%T', '%F %T.%N', '%F %T', '%F']
DEFAULT_FORMATS =
['%FT%T.%N %Z', '%FT%T %Z', '%F %T.%N %Z', '%F %T %Z', '%F %Z'] + DEFAULT_FORMATS_WO_TZ
CURRENT_TIMEZONE =
'current'
KEY_TIMEZONE =
'timezone'

Constants included from LabelProvider

LabelProvider::A, LabelProvider::AN, LabelProvider::SKIPPED_CHARACTERS, LabelProvider::VOWELS

Instance Attribute Summary

Attributes inherited from TimeData

#nsecs

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from TimeData

#<=>, #initialize, #label, #to_c, #to_f, #to_i, #to_int, #to_r

Methods included from LabelProvider

#a_an, #a_an_uc, #article, #combine_strings, #label, #plural_s, #the, #the_uc

Constructor Details

This class inherits a constructor from Puppet::Pops::Time::TimeData

Class Method Details

.convert_timezone(tz) ⇒ String

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Converts a timezone that strptime can parse using ‘%z’ into ‘-HH:MM’ or ‘+HH:MM’

Parameters:

  • tz (String)

    the timezone to convert

Returns:

  • (String)

    the converted timezone

 17 18 19 20 21 22 23 24 25 26 27 28 29
# File 'lib/puppet/pops/time/timestamp.rb', line 17 def self.convert_timezone(tz) if tz =~ /\A[+-]\d\d:\d\d\z/ tz else offset = utc_offset(tz) / 60 if offset < 0 offset = offset.abs sprintf('-%2.2d:%2.2d', offset / 60, offset % 60) else sprintf('+%2.2d:%2.2d', offset / 60, offset % 60) end end end

.format_time(format, time, timezone) ⇒ Object

Formats a ruby Time object using the given timezone

 49 50 51 52 53 54
# File 'lib/puppet/pops/time/timestamp.rb', line 49 def self.format_time(format, time, timezone) unless timezone.nil? || timezone.empty? time = time.localtime(convert_timezone(timezone)) end time.strftime(format) end

.from_hash(args_hash) ⇒ Object

 64 65 66
# File 'lib/puppet/pops/time/timestamp.rb', line 64 def self.from_hash(args_hash) parse(args_hash[KEY_STRING], args_hash[KEY_FORMAT], args_hash[KEY_TIMEZONE]) end

.from_time(t) ⇒ Object

 60 61 62
# File 'lib/puppet/pops/time/timestamp.rb', line 60 def self.from_time(t) new(t.tv_sec * NSECS_PER_SEC + t.tv_nsec) end

.nowObject

 56 57 58
# File 'lib/puppet/pops/time/timestamp.rb', line 56 def self.now from_time(::Time.now) end

.parse(str, format = :default, timezone = nil) ⇒ Object

 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
# File 'lib/puppet/pops/time/timestamp.rb', line 68 def self.parse(str, format = :default, timezone = nil) has_timezone = !(timezone.nil? || timezone.empty? || timezone == :default) if format.nil? || format == :default format = has_timezone ? DEFAULT_FORMATS_WO_TZ : DEFAULT_FORMATS end parsed = nil if format.is_a?(Array) format.each do |fmt| parsed = DateTime._strptime(str, fmt) next if parsed.nil? if parsed.include?(:leftover) || (has_timezone && parsed.include?(:zone)) parsed = nil next end break end if parsed.nil? raise ArgumentError, _( "Unable to parse '%{str}' using any of the formats %{formats}" ) % { str: str, formats: format.join(', ') } end else parsed = DateTime._strptime(str, format) if parsed.nil? || parsed.include?(:leftover) raise ArgumentError, _("Unable to parse '%{str}' using format '%{format}'") % { str: str, format: format } end if has_timezone && parsed.include?(:zone) raise ArgumentError, _( 'Using a Timezone designator in format specification is mutually exclusive to providing an explicit timezone argument' ) end end unless has_timezone timezone = parsed[:zone] has_timezone = !timezone.nil? end fraction = parsed[:sec_fraction] # Convert msec rational found in _strptime hash to usec  fraction *= 1_000_000 unless fraction.nil? # Create the Time instance and adjust for timezone  parsed_time = ::Time.utc(parsed[:year], parsed[:mon], parsed[:mday], parsed[:hour], parsed[:min], parsed[:sec], fraction) parsed_time -= utc_offset(timezone) if has_timezone # Convert to Timestamp  from_time(parsed_time) end

.utc_offset(timezone) ⇒ Integer

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns the zone offset from utc for the given ‘timezone`

Parameters:

  • timezone (String)

    the timezone to get the offset for

Returns:

  • (Integer)

    the timezone offset, in seconds

 36 37 38 39 40 41 42 43 44 45 46
# File 'lib/puppet/pops/time/timestamp.rb', line 36 def self.utc_offset(timezone) if CURRENT_TIMEZONE.casecmp(timezone) == 0 ::Time.now.utc_offset else hash = DateTime._strptime(timezone, '%z') offset = hash.nil? ? nil : hash[:offset] raise ArgumentError, _("Illegal timezone '%{timezone}'") % { timezone: timezone } if offset.nil? offset end end

Instance Method Details

#+(o) ⇒ Object

 128 129 130 131 132 133 134 135 136 137
# File 'lib/puppet/pops/time/timestamp.rb', line 128 def +(o) case o when Timespan Timestamp.new(@nsecs + o.nsecs) when Integer, Float Timestamp.new(@nsecs + (o * NSECS_PER_SEC).to_i) else raise ArgumentError, _("%{klass} cannot be added to a Timestamp") % { klass: a_an_uc(o) } end end

#-(o) ⇒ Object

 139 140 141 142 143 144 145 146 147 148 149 150 151 152
# File 'lib/puppet/pops/time/timestamp.rb', line 139 def -(o) case o when Timestamp # Diff between two timestamps is a timespan  Timespan.new(@nsecs - o.nsecs) when Timespan Timestamp.new(@nsecs - o.nsecs) when Integer, Float # Subtract seconds  Timestamp.new(@nsecs - (o * NSECS_PER_SEC).to_i) else raise ArgumentError, _("%{klass} cannot be subtracted from a Timestamp") % { klass: a_an_uc(o) } end end

#format(format, timezone = nil) ⇒ Object

 154 155 156
# File 'lib/puppet/pops/time/timestamp.rb', line 154 def format(format, timezone = nil) self.class.format_time(format, to_time, timezone) end

#to_sObject

 158 159 160
# File 'lib/puppet/pops/time/timestamp.rb', line 158 def to_s format(DEFAULT_FORMATS[0]) end

#to_timeObject

 162 163 164
# File 'lib/puppet/pops/time/timestamp.rb', line 162 def to_time ::Time.at(to_r).utc end