Class: RDF::Literal::DateTime
- Inherits:
-
RDF::Literal
- Object
- RDF::Literal
- RDF::Literal::DateTime
- Defined in:
- lib/rdf/model/literal/datetime.rb
Overview
A date/time literal.
Constant Summary collapse
- DATATYPE =
RDF::XSD.dateTime
- GRAMMAR =
%r(\A(-?\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?)((?:[\+\-]\d{2}:\d{2})|UTC|GMT|Z)?\Z).freeze
- FORMAT =
'%Y-%m-%dT%H:%M:%S%:z'.freeze
Constants inherited from RDF::Literal
Instance Attribute Summary
Attributes inherited from RDF::Literal
Instance Method Summary collapse
-
#==(other) ⇒ Object
Equal compares as DateTime objects.
-
#canonicalize! ⇒ RDF::Literal
Converts this literal into its canonical lexical representation.
-
#has_timezone? ⇒ Boolean
(also: #has_tz?)
Does the literal representation include a timezone? Note that this is only possible if initialized using a string, or ‘:lexical` option.
-
#humanize(lang = :en) ⇒ String
Returns a human-readable value for the literal.
-
#initialize(value, options = {}) ⇒ DateTime
constructor
A new instance of DateTime.
-
#timezone ⇒ RDF::Literal
Returns the timezone part of arg as an xsd:dayTimeDuration, or ‘nil` if lexical form of literal does not include a timezone.
-
#to_s ⇒ String
Returns the ‘timezone` of the literal.
-
#tz ⇒ RDF::Literal
Returns the timezone part of arg as a simple literal.
-
#valid? ⇒ Boolean
Returns ‘true` if the value adheres to the defined grammar of the datatype.
Methods inherited from RDF::Literal
#compatible?, #comperable_datatype?, datatype_map, datatyped_class, #eql?, #escape, #freeze, #has_datatype?, #has_language?, #hash, #inspect, #literal?, new, #object, #plain?, #simple?, #validate!, #value, #value_hash
Methods included from Term
#<=>, #compatible?, #eql?, #term?, #to_base, #to_term
Methods included from Value
#anonymous?, #canonicalize, #constant?, #graph?, #inspect, #inspect!, #invalid?, #iri?, #list?, #literal?, #node?, #resource?, #statement?, #term?, #to_nquads, #to_ntriples, #to_rdf, #to_term, #type_error, #uri?, #validate!, #variable?
Constructor Details
#initialize(value, options = {}) ⇒ DateTime
Returns a new instance of DateTime.
15 16 17 18 19 20 21 22 23 24 |
# File 'lib/rdf/model/literal/datetime.rb', line 15 def initialize(value, = {}) @datatype = RDF::URI([:datatype] || self.class.const_get(:DATATYPE)) @string = [:lexical] if .has_key?(:lexical) @string ||= value if value.is_a?(String) @object = case when value.is_a?(::DateTime) then value when value.respond_to?(:to_datetime) then value.to_datetime else ::DateTime.parse(value.to_s) end rescue nil end |
Instance Method Details
#==(other) ⇒ Object
Equal compares as DateTime objects
125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
# File 'lib/rdf/model/literal/datetime.rb', line 125 def ==(other) # If lexically invalid, use regular literal testing return super unless self.valid? case other when Literal::DateTime return super unless other.valid? self.object == other.object when Literal::Time, Literal::Date false else super end end |
#canonicalize! ⇒ RDF::Literal
Converts this literal into its canonical lexical representation. with date and time normalized to UTC.
32 33 34 35 36 37 38 39 40 41 |
# File 'lib/rdf/model/literal/datetime.rb', line 32 def canonicalize! if self.valid? @string = if has_timezone? @object.new_offset.new_offset.strftime(FORMAT[0..-4] + 'Z') else @object.strftime(FORMAT[0..-4]) end end self end |
#has_timezone? ⇒ Boolean Also known as: has_tz?
Does the literal representation include a timezone? Note that this is only possible if initialized using a string, or ‘:lexical` option.
89 90 91 92 |
# File 'lib/rdf/model/literal/datetime.rb', line 89 def has_timezone? md = self.to_s.match(GRAMMAR) md && !!md[2] end |
#humanize(lang = :en) ⇒ String
Returns a human-readable value for the literal
110 111 112 113 114 115 116 117 118 119 120 121 |
# File 'lib/rdf/model/literal/datetime.rb', line 110 def humanize(lang = :en) d = object.strftime("%r on %A, %d %B %Y") if has_timezone? zone = if self.tz == 'Z' "UTC" else self.tz end d.sub!(" on ", " #{zone} on ") end d end |
#timezone ⇒ RDF::Literal
Returns the timezone part of arg as an xsd:dayTimeDuration, or ‘nil` if lexical form of literal does not include a timezone.
59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/rdf/model/literal/datetime.rb', line 59 def timezone if tz == 'Z' RDF::Literal("PT0S", datatype: RDF::XSD.dayTimeDuration) elsif md = tz.to_s.match(/^([+-])?(\d+):(\d+)?$/) plus_minus, hour, min = md[1,3] plus_minus = nil unless plus_minus == "-" hour = hour.to_i min = min.to_i res = "#{plus_minus}PT#{hour}H#{"#{min}M" if min > 0}" RDF::Literal(res, datatype: RDF::XSD.dayTimeDuration) end end |
#to_s ⇒ String
Returns the ‘timezone` of the literal. If the
Returns the value as a string.
101 102 103 |
# File 'lib/rdf/model/literal/datetime.rb', line 101 def to_s @string || @object.strftime(FORMAT).sub("+00:00", 'Z') end |
#tz ⇒ RDF::Literal
Returns the timezone part of arg as a simple literal. Returns the empty string if there is no timezone.
48 49 50 51 52 |
# File 'lib/rdf/model/literal/datetime.rb', line 48 def tz zone = has_timezone? ? object.zone : "" zone = "Z" if zone == "+00:00" RDF::Literal(zone) end |
#valid? ⇒ Boolean
Returns ‘true` if the value adheres to the defined grammar of the datatype.
Special case for date and dateTime, for which ‘0000’ is not a valid year
80 81 82 |
# File 'lib/rdf/model/literal/datetime.rb', line 80 def valid? super && object && value !~ %r(\A0000) end |