ISO 8601 (JIS X0301) の時間間隔に基づいて定義された When::TM::Duration の subclass
オブジェクトの生成
引数パターン1
date : [Numeric]
期間の日付要素
time : [Numeric]
期間の時刻要素
week : [Numeric]
期間の週日要素
引数パターン2
value : Numeric
(index に対応する桁での)時間間隔
index : Numeric
When::Coordinates で定義している分解能定数に対応する列挙型
YEAR, ... ,SECOND
range : Range
生成する桁の範囲(デフォルト : YEAR..SECOND)
# File when/tmobjects.rb, line 1090
1090: def initialize(*args)
1091: @options = (args[1].kind_of?(Hash)) ? (args.pop.reject {|key,value| value == nil}) : {}
1092:
1093: unless args[0].kind_of?(Numeric)
1094: @date, @time, @week = args
1095: return
1096: end
1097:
1098: value, index, range = args
1099: range = YEAR..SECOND unless (range)
1100: max = range.first
1101: min = range.last
1102: min += 1 if (range.exclude_end?)
1103: if (index < max)
1104: if (index > MONTH)
1105: max = index.floor
1106: else
1107: value *= 10**(max-index)
1108: index = max
1109: end
1110: elsif (index > min)
1111: if (index <= DAY)
1112: min = index.ceil
1113: else
1114: value *= 0.1**(index-min)
1115: index = min
1116: end
1117: end
1118: value = value.to_i unless value.kind_of?(Pair) || value.to_i != value.to_f
1119: @date = Array.new(1-max, 0) if (max <= DAY) && (index <= DAY)
1120: @time = Array.new(1+min, 0) if (min > DAY) && (index > DAY)
1121: if (index == WEEK)
1122: @week = [value, 0]
1123: @date[DAY-1] = 7 * value
1124: elsif (index <= DAY)
1125: @date[index-1] = value
1126: else
1127: @time[index] = value
1128: end
1129: end
乗算
times : Numeric returns : When::TM::PeriodDuration
# File when/tmobjects.rb, line 1003
1003: def *(times)
1004: period = self.dup
1005: period.date = @date.map {|v| times * v} if @date
1006: period.week = @week.map {|v| times * v} if @week
1007: period.time = @time.map {|v| times * v} if @time
1008: return period
1009: end
符号反転
returns : When::TM::PeriodDuration
# File when/tmobjects.rb, line 1039
1039: def -@
1040: period = self.dup
1041: period.date = @date.map {|v| -v} if @date
1042: period.week = @week.map {|v| -v} if @week
1043: period.time = @time.map {|v| -v} if @time
1044: return period
1045: end
要素の参照
index : Numeric
When::Coordinates で定義している分解能定数に対応する列挙型
YEAR, ... ,SECOND
returns : Numeric
# File when/tmobjects.rb, line 904
904: def [](index)
905: if (index == WEEK)
906: return nil unless (@week)
907: return @week[0]
908: elsif (index <= 0)
909: return nil unless (@date)
910: return @date[index-1]
911: else
912: return nil unless (@time)
913: return @time[index]
914: end
915: end
期間に含まれる日数を示す
type : Numeric
# File when/tmobjects.rb, line 956
956: def days
957: return nil unless (@date)
958: return @date[DAY-1].to_s
959: end
持続期間であることを文字’P’で示す
type : String
# File when/tmobjects.rb, line 921
921: def designator
922: return 'P'
923: end
期間に含まれる時間数を示す
type : Numeric
# File when/tmobjects.rb, line 974
974: def hours
975: return nil unless (@time)
976: return @time[HOUR].to_s
977: end
期間に含まれる分数を示す
type : Numeric
# File when/tmobjects.rb, line 983
983: def minutes
984: return nil unless (@time)
985: return @time[MINUTE].to_s
986: end
期間に含まれる月数を示す
type : Numeric
# File when/tmobjects.rb, line 938
938: def months
939: return nil unless (@date)
940: return @date[MONTH-1].to_s
941: end
期間に含まれる秒数を示す
type : Numeric
# File when/tmobjects.rb, line 992
992: def seconds
993: return nil unless (@time)
994: return @time[SECOND].to_s
995: end
符号
returns : Integer
0 との比較により、負,0,正の値を返す
# File when/tmobjects.rb, line 1016
1016: def sign
1017: if @week
1018: @week.each do |w|
1019: return 1 if +w < 0
1020: end
1021: end
1022: if @date
1023: @date.each do |d|
1024: return 1 if +d < 0
1025: end
1026: end
1027: if @time
1028: @time.each do |t|
1029: return 1 if +t < 0
1030: end
1031: end
1032: return 1
1033: end
期間が1日より短い時間単位を含むとき文字’T’で示す
type : String
# File when/tmobjects.rb, line 965
965: def time_indicator
966: return (@time) ? 'T' : nil
967: end
文字列化
returns : String
# File when/tmobjects.rb, line 1051
1051: def to_s
1052: period = 'P'
1053: if @week
1054: period += @week[0].abs.to_s + 'W'
1055: period += @week[1].abs.to_s + 'D' unless @week[1] == 0
1056: elsif @date
1057: (-@date.length..1).each do |i|
1058: period += @date[i].abs.to_s + PRECISION_NAME[i+1][0..0] unless @date[i] == 0
1059: end
1060: end
1061: if @time
1062: period += 'T'
1063: (1..@time.length-1).each do |i|
1064: period += @time[i].abs.to_s + PRECISION_NAME[i][0..0] unless @time[i] == 0
1065: end
1066: end
1067: period = '-' + period if sign < 0
1068: return period
1069: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.