Class: OpenHAB::Core::Types::DateTimeType

Inherits:
Object
  • Object
show all
Includes:
Command, State
Defined in:
lib/openhab/core/types/date_time_type.rb

Overview

DateTimeType uses a ZonedDateTime internally.

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Type

#==

Constructor Details

#initialize(value = nil) ⇒ DateTimeType

Create a new instance of DateTimeType

Parameters:



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/openhab/core/types/date_time_type.rb', line 82

def initialize(value = nil)
  if value.respond_to?(:to_zoned_date_time)
    super(value.to_zoned_date_time)
    return
  elsif value.respond_to?(:to_time)
    super(value.to_time.to_zoned_date_time)
    return
  elsif value.respond_to?(:to_str)
    # strings respond_do?(:to_d), but we want to avoid that conversion
    super(value.to_str)
    return
  elsif value.respond_to?(:to_d)
    super(Time.at(value.to_d).to_zoned_date_time)
    return
  end

  super
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object

Forward missing methods to the ‘ZonedDateTime` object or a ruby `Time` object representing the same instant



208
209
210
211
212
213
# File 'lib/openhab/core/types/date_time_type.rb', line 208

def method_missing(method, *args, &block)
  return zoned_date_time.send(method, *args, &block) if zoned_date_time.respond_to?(method)
  return to_time.send(method, *args, &block) if ::Time.instance_methods.include?(method.to_sym)

  super
end

Class Method Details

.parse(time_string) ⇒ DateTimeType

Parses a String representing a time into a OpenHAB::Core::Types::DateTimeType. First tries to parse it

using Java's parser, then falls back to the Ruby `Time.parse`.

Parameters:

  • time_string (String)

Returns:



43
44
45
46
47
48
49
50
51
52
53
# File 'lib/openhab/core/types/date_time_type.rb', line 43

def parse(time_string)
  time_string = "#{time_string}Z" if TIME_ONLY_REGEX.match?(time_string)
  DateTimeType.new(time_string)
rescue java.lang.StringIndexOutOfBoundsException, java.lang.IllegalArgumentException => e
  # Try Ruby's Time.parse if DateTimeType parser fails
  begin
    DateTimeType.new(::Time.parse(time_string).to_zoned_date_time)
  rescue ArgumentError
    raise ArgumentError, e.message
  end
end

Instance Method Details

#+(other) ⇒ DateTimeType

Add other to self

Parameters:

Returns:



220
221
222
223
224
225
226
227
228
229
230
# File 'lib/openhab/core/types/date_time_type.rb', line 220

def +(other)
  if other.is_a?(Duration)
    DateTimeType.new(zoned_date_time.plus(other))
  elsif other.respond_to?(:to_d)
    DateTimeType.new(zoned_date_time.plus_nanos((other.to_d * 1_000_000_000).to_i))
  elsif other.respond_to?(:coerce) && (lhs, rhs = other.coerce(to_d))
    lhs + rhs
  else
    raise TypeError, "\#{other.class} can't be coerced into \#{self.class}"
  end
end

#-(other) ⇒ DateTimeType, Duration

Subtract other from self

if other is a Duration-like object, the result is a new OpenHAB::Core::Types::DateTimeType of duration seconds earlier in time.

if other is a DateTime-like object, the result is a Duration representing how long between the two instants in time.

Parameters:

Returns:



243
244
245
246
247
248
249
250
251
252
253
254
255
# File 'lib/openhab/core/types/date_time_type.rb', line 243

def -(other)
  if other.is_a?(Duration)
    DateTimeType.new(zoned_date_time.minus(other))
  elsif other.respond_to?(:to_time)
    to_time - other.to_time
  elsif other.respond_to?(:to_d)
    DateTimeType.new(zoned_date_time.minus_nanos((other.to_d * 1_000_000_000).to_i))
  elsif other.respond_to?(:coerce) && (lhs, rhs = other.coerce(to_d))
    lhs - rhs
  else
    raise TypeError, "\#{other.class} can't be coerced into \#{self.class}"
  end
end

#<=>(other) ⇒ Integer?

Comparison

Parameters:

  • other (Object)

    object to compare to

Returns:

  • (Integer, nil)

    -1, 0, +1 depending on whether ‘other` is less than, equal to, or greater than self

    ‘nil` is returned if the two values are incomparable.



122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/openhab/core/types/date_time_type.rb', line 122

def <=>(other)
  logger.trace("(#{self.class}) #{self} <=> #{other} (#{other.class})")
  if other.is_a?(self.class)
    zoned_date_time <=> other.zoned_date_time
  elsif other.respond_to?(:to_time)
    to_time <=> other.to_time
  elsif other.respond_to?(:coerce)
    return nil unless (lhs, rhs = other.coerce(self))

    lhs <=> rhs
  end
end

#coerce(other) ⇒ [DateTimeType, DateTimeType]?

Type Coercion

Coerce object to a DateTimeType

Parameters:

  • other (Time)

    object to coerce to a DateTimeType

Returns:



144
145
146
147
148
149
# File 'lib/openhab/core/types/date_time_type.rb', line 144

def coerce(other)
  logger.trace("Coercing #{self} as a request from #{other.class}")
  return [other, zoned_date_time] if other.respond_to?(:to_zoned_date_time)

  [DateTimeType.new(other), self] if other.respond_to?(:to_time)
end

#eql?(other) ⇒ true, false

Check equality without type conversion

Returns:

  • (true, false)

    if the same value is represented, without type conversion



106
107
108
109
110
# File 'lib/openhab/core/types/date_time_type.rb', line 106

def eql?(other)
  return false unless other.instance_of?(self.class)

  zoned_date_time.compare_to(other.zoned_date_time).zero?
end

#to_fFloat

Returns the value of time as a floating point number of seconds since the Epoch

Returns:

  • (Float)

    Number of seconds since the Epoch, with nanosecond presicion



156
157
158
# File 'lib/openhab/core/types/date_time_type.rb', line 156

def to_f
  zoned_date_time.to_epoch_second + (zoned_date_time.nano / 1_000_000_000)
end

#to_zoned_date_time(context = nil) ⇒ ZonedTimeTime

Parameters:

  • context (ZonedDateTime, nil) (defaults to: nil)

    A ZonedDateTime used to fill in missing fields during conversion. Not used in this class.

Returns:

  • (ZonedTimeTime)


60
61
62
# File 'lib/openhab/core/types/date_time_type.rb', line 60

def to_zoned_date_time(context = nil) # rubocop:disable Lint/UnusedMethodArgument
  zoned_date_time
end

#utc?true, false

Returns true if time represents a time in UTC (GMT)

Returns:

  • (true, false)

    true if utc_offset == 0, false otherwise



174
175
176
# File 'lib/openhab/core/types/date_time_type.rb', line 174

def utc?
  utc_offset.zero?
end

#utc_offsetInteger

The offset in seconds from UTC

Returns:

  • (Integer)

    The offset from UTC, in seconds



165
166
167
# File 'lib/openhab/core/types/date_time_type.rb', line 165

def utc_offset
  zoned_date_time.offset.total_seconds
end

#wdayInteger

Returns an integer representing the day of the week, 0..6, with Sunday == 0.

Returns:



183
184
185
# File 'lib/openhab/core/types/date_time_type.rb', line 183

def wday
  zoned_date_time.day_of_week.value % 7
end

#zoneString

The timezone

Returns:

  • (String)

    The timezone in ‘[+-]hh:mm(:ss)` format (`Z` for UTC)



192
193
194
# File 'lib/openhab/core/types/date_time_type.rb', line 192

def zone
  zoned_date_time.zone.id
end