Class: When::TM::ClockTime

Inherits:
TemporalPosition show all
Defined in:
lib/when_exe/tmposition.rb,
lib/when_exe/inspect.rb

Overview

時刻

see gml schema

Constant Summary

Constants inherited from TemporalPosition

TemporalPosition::AMPM, TemporalPosition::Format, TemporalPosition::HashProperty

Constants included from Coordinates

Coordinates::Bahai, Coordinates::CommonResidue, Coordinates::DefaultDateIndices, Coordinates::DefaultDayIndex, Coordinates::DefaultTimeIndices, Coordinates::IndianCities, Coordinates::Javanese, Coordinates::MATCH, Coordinates::Mayan, Coordinates::PERIOD, Coordinates::PERIOD_NAME, Coordinates::PRECISION, Coordinates::PRECISION_NAME, Coordinates::Tibetan, Coordinates::VALUE, Coordinates::Yi

Constants included from When

CENTURY, DAY, DECADE, DurationP1D, DurationP1M, DurationP1W, DurationP1Y, EUCJP, HOUR, MINUTE, MONTH, MinusInfinity, PlusInfinity, SECOND, STRING, SYSTEM, SourceURI, When::TimeValue, UTF8, VERSION, W31J, WEEK, YEAR

Constants included from Parts::Resource

Parts::Resource::LabelProperty

Constants included from IndeterminateValue

IndeterminateValue::After, IndeterminateValue::Before, IndeterminateValue::I, IndeterminateValue::Max, IndeterminateValue::Min, IndeterminateValue::Now, IndeterminateValue::S, IndeterminateValue::Unknown

Instance Attribute Summary collapse

Attributes inherited from TemporalPosition

#events, #frame, #indeterminated_position, #location, #options, #precision, #query, #trans

Attributes included from Parts::Resource

#_pool, #child, #keys, #locale, #namespace

Instance Method Summary collapse

Methods inherited from TemporalPosition

#+, #+@, #-, #<=>, #==, #[], #^, #_attr, _instance, #_notes, _options, _setup_, #_to_h, #_to_s, _verify, #calendar_name, #clock_name, #copy, #dynamical_time, #floor, #has_next?, #has_time?, #include?, #is?, #month_included, #note?, #notes, #period, #prev, #rate_of_clock, #reference_label, #scan, #strftime, #succ, #term, #time_standard, #to_clock_time, #to_date, #to_date_time, #to_date_uri, #to_f, #to_i, #to_residue, #to_time, #to_uri, #week_included, #year_included

Methods included from Coordinates

to_deg, to_dms

Methods included from When

Calendar, CalendarEra, CalendarNote, Clock, Duration, M17n, MonthName, Pair, Residue, Resource, TemporalPosition, _setup_, at, client, config, era, free_conv, m17n, now, server, today, utc, when?

Methods included from TemporalPosition::Conversion

#julian_date, #tm_position

Methods included from Parts::Resource

#[], #^, _decode, _encode, _extract_prefix, _instance, _parse, _path_with_prefix, _replace_tags, _setup_, #each, #enum_for, #hierarchy, #include?, #included?, #iri, #leaf?, #m17n, #map, #next, #parent, #prev, #registered?

Methods included from Parts::Resource::Pool

#[], #[]=, #_pool, #_setup_, #pool_keys

Methods included from Parts::Resource::Synchronize

#synchronize

Constructor Details

#initialize(time, options = {}) ⇒ ClockTime

オブジェクトの生成

Parameters:

  • time (String)

    ISO8601形式の時刻表現

  • time (Array<Numeric>)

    (日, 時, 分, 秒)

  • options (Hash) (defaults to: {})

    以下の通り

Options Hash (options):



1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
# File 'lib/when_exe/tmposition.rb', line 1361

def initialize(time, options={})
  # 参照系の取得
  @frame = options[:frame] || Clock.local_time
  @frame = When.Clock(@frame) if (@frame.kind_of?(String))
  options.delete(:frame)

  # 時刻表現の解読 ( Time Zone の解釈 )
  if (time.kind_of?(String))
    case time
    when /^([-+])?(\d{2,}?):?(\d{2})?:?(\d{2}(\.\d+)?)?$/
      sign, hh, mm, ss = $~[1..4]
      time = @frame._validate([0,0,0,0],
             [0,
              -(sign.to_s + "0" + hh.to_s).to_i,
              -(sign.to_s + "0" + mm.to_s).to_i,
              Pair._en_number(-(sign.to_s + "0" + ss.to_s).to_f)])
      time[0] = Pair.new(0, time[0].to_i) if (time[0] != 0)
    when /^Z$/
      time = [0,0,0,0]
    else
      raise ArgumentError, "Invalid Time Format"
    end
  end
  @clk_time = time

  # 分解能
  @precision = @frame._precision(time, options.delete(:precision))

  super(options)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class When::TM::TemporalPosition

Instance Attribute Details

#clk_timeArray<Numeric> (readonly) Also known as: clkTime

Note:

ISO19108 では sequence<Integer> だが、閏時・閏秒などが表現可能なよう Numeric としている。

時刻要素

Returns:



1294
1295
1296
# File 'lib/when_exe/tmposition.rb', line 1294

def clk_time
  @clk_time
end

Instance Method Details

#_copy(options = {}) ⇒ Object

protected 属性のコピー



1341
1342
1343
1344
1345
1346
1347
1348
1349
# File 'lib/when_exe/tmposition.rb', line 1341

def _copy(options={})
  @clk_time = options[:time]  if (options.key?(:time))
  @frame    = options[:clock] if (options.key?(:clock))
  if (options.key?(:tz_prop))
    @frame  = @frame.dup
    @frame.tz_prop = options[:tz_prop]
  end
  return super
end

#_time_to_s(precision = @precision) ⇒ String

protected

時間帯以外の部分の文字列化

Parameters:

  • precision (Integer) (defaults to: @precision)

    どの桁まで多言語対応文字列化するか、分解能で指定する

Returns:



844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
# File 'lib/when_exe/inspect.rb', line 844

def _time_to_s(precision=@precision)
  terms   = []
  format  = ''
  format += Pair::DL2[@clk_time[0] * 0] || ':' if @frame.pair[0] || @clk_time[0].kind_of?(Pair)

  # 時分
  digits = [@clk_time.length-2, precision].min
  if digits > 0
    terms  += @clk_time[1..-1]
    format += "%02d:" * digits
    format  = format[0..-2] if precision == digits
  end

  # 秒
  digits  = [precision - @clk_time.length + 1, STRING-SECOND].min
  if digits == 0
    format += "%02d"
  elsif digits > 0
    factor  = 10**digits
    terms[-1] = ((@clk_time[-1] + 1E-6) * factor).floor.to_f / factor  # 切り捨て(10で割る丸めガードあり)
    format += "%02.#{digits}f"
  end

  # 結果
  time = Pair._format([format] + terms)
  time.sub(/([^\d])(\d)\./, '\10\2.')
end

#_to_hash_value(options = {}) ⇒ Object

to_h のための要素生成



875
876
877
# File 'lib/when_exe/inspect.rb', line 875

def _to_hash_value(options={})
  clk_time.map {|e| _m17n_form(e, options) }
end

#carryNumeric

繰り上がり

Returns:

  • (Numeric)

    日付の境界が午前0時でない場合、clk_time の最上位桁に 0 以外が入ることがある



1324
1325
1326
# File 'lib/when_exe/tmposition.rb', line 1324

def carry
  return @clk_time[0]
end

#hour(d = 0) ⇒ Numeric

Parameters:

  • d (Integer) (defaults to: 0)

    時刻が‘時分秒’でない表現のための桁位置変更指示(小さいほうに位置をずらす)

Returns:



807
808
809
# File 'lib/when_exe/inspect.rb', line 807

def hour(d=0)
  @clk_time[HOUR+d]
end

#minute(d = 0) ⇒ Numeric Also known as: min

Parameters:

  • d (Integer) (defaults to: 0)

    時刻が‘時分秒’でない表現のための桁位置変更指示(小さいほうに位置をずらす)

Returns:



818
819
820
# File 'lib/when_exe/inspect.rb', line 818

def minute(d=0)
  @clk_time[MINUTE+d]
end

#name(index, format = nil) ⇒ When::BasicTypes::M17n

要素の多言語対応文字列化

Parameters:

  • index (Integer)

    多言語対応文字列化する要素の指定

  • format (When::BasicTypes::M17n) (defaults to: nil)

    多言語対応文字列化の書式

Returns:



756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
# File 'lib/when_exe/inspect.rb', line 756

def name(index, format=nil)
  digit      = _digit(index) {|digit| digit > DAY}
  coordinate = @clk_time[digit]
  return m17n(format % coordinate) if format

  indices  = @frame.indices[digit-1]
  if indices
    trunk  = indices.trunk
    branch = indices.branch
  end
  format = branch ? m17n("%02d:") : "%02d"
  return m17n(format % coordinate) unless trunk
  trunk  = trunk[coordinate * 1]
  return m17n(trunk) unless branch
  return trunk.prefix(branch[coordinate * 0])
end

#second(d = 0) ⇒ Numeric Also known as: sec

Parameters:

  • d (Integer) (defaults to: 0)

    時刻が‘時分秒’でない表現のための桁位置変更指示(小さいほうに位置をずらす)

Returns:



830
831
832
# File 'lib/when_exe/inspect.rb', line 830

def second(d=0)
  @clk_time[SECOND+d]
end

#to_m17n(precision = @precision) ⇒ When::BasicTypes::M17n

多言語対応文字列化 - When.exe Standard Representation により多言語対応文字列化する

Parameters:

  • precision (Integer) (defaults to: @precision)

    どの桁まで多言語対応文字列化するか、分解能で指定する

Returns:



779
780
781
782
783
784
785
# File 'lib/when_exe/inspect.rb', line 779

def to_m17n(precision=@precision)
  time  = m17n('T' + _time_to_s(precision))
  if @frame
    time += @frame.zone unless Clock.is_local_time_set? && @frame.equal?(Clock.local_time)
  end
  return time
end

#to_s(precision = @precision) ⇒ String

文字列化 - When.exe Standard Representation により文字列化する

Parameters:

  • precision (Integer) (defaults to: @precision)

    どの桁まで多言語対応文字列化するか、分解能で指定する

Returns:



793
794
795
796
797
798
799
# File 'lib/when_exe/inspect.rb', line 793

def to_s(precision=@precision)
  time  = 'T' + _time_to_s(precision)
  if @frame
    time += @frame.zone unless Clock.is_local_time_set? && @frame.equal?(Clock.local_time)
  end
  return time
end

#universal_timeNumeric

内部時間

Returns:

  • (Numeric)

    T00:00:00Z からの Universal Coordinated Time の経過時間 / 128秒

    時法によっては、異なる意味を持つことがある

Raises:

  • (NameError)


1313
1314
1315
1316
# File 'lib/when_exe/tmposition.rb', line 1313

def universal_time
  raise NameError, "Temporal Reference System is not defined" unless @frame
  @universal_time ||= @frame.to_universal_time(@clk_time)
end

#value(index) ⇒ Numeric

要素の参照

Parameters:

  • index (Integer, String)

    参照する要素の指定

Returns:



1334
1335
1336
# File 'lib/when_exe/tmposition.rb', line 1334

def value(index)
  @clk_time[_digit(index) {|digit| digit >= DAY}]
end