Class: When::TM::PeriodDuration
- Includes:
- When, Coordinates
- Defined in:
- lib/when_exe/tmobjects.rb
Overview
ISO 8601 (JIS X0301) の時間間隔に基づいて定義された When::TM::Duration の subclass
Defined Under Namespace
Modules: NoDuration
Constant Summary
Constants included from Coordinates
Coordinates::Bahai, Coordinates::Chinese, Coordinates::Common, Coordinates::DefaultDateIndices, Coordinates::DefaultDayIndex, Coordinates::DefaultTimeIndices, Coordinates::Indian, Coordinates::Iranian, Coordinates::Javanese, Coordinates::MATCH, Coordinates::Mayan, Coordinates::PERIOD, Coordinates::PERIOD_NAME, Coordinates::PRECISION, Coordinates::PRECISION_NAME, Coordinates::Russian, Coordinates::Tibetan, Coordinates::VALUE, Coordinates::Yi
Constants included from When
AUTHOR, CENTURY, COPYRIGHT, DAY, DECADE, EUCJP, HOUR, MINUTE, MONTH, MinusInfinity, Month, P1D, P1M, P1W, P1Y, PT1H, PT1M, PT1S, PlusInfinity, RootDir, SECOND, STRING, SYSTEM, SourceURI, When::TimeValue, UTF8, VERSION, W31J, WEEK, Week, YEAR, YEARS
Constants inherited from Duration
Duration::DAY, Duration::DurationUnits, Duration::HOUR, Duration::MINUTE, Duration::MONTH, Duration::SECOND, Duration::SYSTEM, Duration::Unit, Duration::UnitName, Duration::WEEK, Duration::YEAR
Instance Attribute Summary collapse
-
#date ⇒ Array<Numeric>
readonly
期間の日付要素.
-
#time ⇒ Array<Numeric>
readonly
期間の時刻要素.
-
#to_day ⇒ Integer
readonly
期間の日数.
-
#week ⇒ Array<Numeric>
readonly
期間の週日要素.
Attributes inherited from Duration
Class Method Summary collapse
-
._to_array(period) ⇒ Array<Numeric, Array<Numeric>>
ISO 8601 形式の表現を分解して配列化する.
Instance Method Summary collapse
-
#*(times) ⇒ When::TM::PeriodDuration
乗算.
-
#+(other) ⇒ WWhen::TM::PeriodDuration, other と同じクラス
加算.
-
#-(other) ⇒ When::TM::PeriodDuration
減算.
-
#-@ ⇒ When::TM::PeriodDuration
符号反転.
-
#/(divisor) ⇒ When::TM::PeriodDuration
除算.
-
#<=>(other) ⇒ Integer
比較.
-
#==(other) ⇒ Boolean
オブジェクトの同値.
-
#[](index) ⇒ Numeric
要素の参照.
-
#days ⇒ String
期間に含まれる日数を示す.
-
#designator ⇒ String
持続期間であることを文字‘P’で示す.
-
#hours ⇒ String
期間に含まれる時間数を示す.
-
#initialize(*args) ⇒ PeriodDuration
constructor
オブジェクトの生成.
-
#minutes ⇒ String
期間に含まれる分数を示す.
-
#months ⇒ String
期間に含まれる月数を示す.
-
#seconds ⇒ String
期間に含まれる秒数を示す.
-
#sign ⇒ Integer
符号.
-
#time_indicator ⇒ String
(also: #timeIndicator)
期間が1日より短い時間単位を含むとき文字‘T’で示す.
-
#to_period_duration ⇒ When::TM::PeriodDuration
When::TM::PeriodDuration への変換.
-
#to_s ⇒ String
文字列化.
-
#weeks ⇒ String
期間に含まれる週数を示す.
-
#years ⇒ String
期間に含まれる年数を示す.
Methods included from Coordinates
Methods included from When
Border, Calendar, CalendarEra, CalendarNote, Clock, Duration, Index, Location, M17n, MonthName, Pair, Residue, Resource, TemporalPosition, Wikipedia, _const_missing, _define_common_calendar_types, _setup_, _setup_info, at, client, column, config, const_missing, era, free_conv, m17n, now, server, today, when?
Methods inherited from Duration
#_enumerator, #abs, #after, #before, #coerce, dhms, #inspect, #rational_duration, #to_as_duration, #to_dhms, #to_duration, #to_f, #to_i, #to_interval_length, unit, #unit
Constructor Details
#initialize(date = nil, time = nil, week = nil) ⇒ PeriodDuration #initialize(value, index, range = YEAR..SECOND) ⇒ PeriodDuration
オブジェクトの生成
1255 1256 1257 1258 1259 1260 1261 1262 1263 |
# File 'lib/when_exe/tmobjects.rb', line 1255 def initialize(*args) @options = (args[-1].kind_of?(Hash)) ? (args.pop.reject {|key,value| value == nil}) : {} if args[0].kind_of?(Numeric) _initialize_by_unit(*args) else @date, @time, @week = args end _duration end |
Instance Attribute Details
#date ⇒ Array<Numeric>
期間の日付要素
971 972 973 |
# File 'lib/when_exe/tmobjects.rb', line 971 def date @date end |
#time ⇒ Array<Numeric>
期間の時刻要素
985 986 987 |
# File 'lib/when_exe/tmobjects.rb', line 985 def time @time end |
#to_day ⇒ Integer (readonly)
固定の整数で表現できない場合は nil
期間の日数
965 966 967 |
# File 'lib/when_exe/tmobjects.rb', line 965 def to_day @to_day end |
Class Method Details
._to_array(period) ⇒ Array<Numeric, Array<Numeric>>
ISO 8601 形式の表現を分解して配列化する
901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 |
# File 'lib/when_exe/tmobjects.rb', line 901 def self._to_array(period) return nil unless period.gsub(/_+/, '') =~ /\A([-+])?P(.*?)?(?:T(.+))?\z/ sign = ($1 == '-') ? -1 : +1 pdate, ptime = $~[2..3] # 時分秒形式 if (ptime =~ /\A(?:([.,\d]+)?([:*=])?H)?(?:([.,\d]+)?([:*=])?M)?(?:([.,\d]+)?([:*=])?S)?((?:[.,\d]*[:*=]?X)*)\z/) trunk = [1,3,5].map {|i| $~[i] ? Pair._en_pair($~[i], $~[i+1]) : 0 } extra = $7 ? $7.scan(/([.,\d]+)?([:*=])?X/).map {|d| d[0] ? Pair._en_pair(d[0], d[1]) : 0 } : [] time = [0] + trunk + extra time = nil if time.uniq == [0] end case pdate # 年月日形式 when /\A((?:[.,\d]*[-*=]?X)*)(?:([.,\d]+)?([-*=])?Y)?(?:([.,\d]+)?([-+*&%!>=<?])?M)?(?:([.,\d]+)?([-*=?%])?D)?\z/ trunk = [2,4,6].map {|i| $~[i] ? Pair._en_pair($~[i], $~[i+1]) : 0 } extra = $1 ? $1.scan(/([.,\d]+)?([:*=])?X/).map {|d| d[0] ? Pair._en_pair(d[0], d[1]) : 0 } : [] date = extra + trunk date = nil if date.uniq == [0] return sign, date, time # 週日形式 when /\A(?:([.,\d]+)?([:*=])?W)(?:([.,\d]+)?([-*=?%])?D)?\z/ week = [1,3].map {|i| $~[i] ? Pair._en_pair($~[i], $~[i+1]) : 0 } return sign, nil, time if week.uniq == [0] date = [0, 0, week[1] + 7*week[0]] return sign, date, time, week # 代用形式 else pdate += 'T' + ptime if ptime f, d, t, z, e = When::BasicTypes::DateTime._to_array(pdate, {:abbr=>[0]*20}) return nil if e if d case f when :day ; date = [d[0], 0, d[1]] when :century, nil ; date = (0..2).map {|i| d[i]||0} when :week ; date, week = [0,0,d[0]*7+(d[1]||0)], [d[0], d[1]||0] end end time = t ? (t.map {|v| v||0}) : nil return sign, date, time, week end end |
Instance Method Details
#*(times) ⇒ When::TM::PeriodDuration
乗算
1189 1190 1191 1192 1193 1194 1195 1196 |
# File 'lib/when_exe/tmobjects.rb', line 1189 def *(times) period = self.dup period.send(:date=, @date.map {|v| v *= times; v.to_i==v.to_f ? v.to_i : v}) if @date period.send(:week=, @week.map {|v| v *= times; v.to_i==v.to_f ? v.to_i : v}) if @week period.send(:time=, @time.map {|v| v *= times; v.to_i==v.to_f ? v.to_i : v}) if @time period.send(:_duration) return period end |
#+(other) ⇒ WWhen::TM::PeriodDuration, other と同じクラス
加算
1169 1170 1171 |
# File 'lib/when_exe/tmobjects.rb', line 1169 def +(other) other.kind_of?(When::TM::PeriodDuration) ? _plus(other, +1) : other + self end |
#-(other) ⇒ When::TM::PeriodDuration
減算
1179 1180 1181 |
# File 'lib/when_exe/tmobjects.rb', line 1179 def -(other) _plus(other, -1) end |
#-@ ⇒ When::TM::PeriodDuration
符号反転
1091 1092 1093 1094 1095 1096 1097 1098 |
# File 'lib/when_exe/tmobjects.rb', line 1091 def -@ period = self.dup period.send(:date=, @date.map {|v| -v}) if @date period.send(:week=, @week.map {|v| -v}) if @week period.send(:time=, @time.map {|v| -v}) if @time period.send(:_duration) return period end |
#/(divisor) ⇒ When::TM::PeriodDuration
除算
1204 1205 1206 |
# File 'lib/when_exe/tmobjects.rb', line 1204 def /(divisor) self * (1.0 / divisor) end |
#<=>(other) ⇒ Integer
比較
1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 |
# File 'lib/when_exe/tmobjects.rb', line 1122 def <=>(other) unless (@date && @date.size) == (other.date && other.date.size) && (@week && @week.size) == (other.week && other.week.size) && (@time && @time.size) == (other.time && other.time.size) raise ArgumentError, "PeriodDuration structure mismatch" end (0...@week.size).each do |i| sgn = +@week[i] <=> +other.week[i] return sgn unless sgn == 0 end if @week (0...@date.size).each do |i| sgn = +@date[i] <=> +other.date[i] return sgn unless sgn == 0 end if @date (0...@time.size).each do |i| sgn = +@time[i] <=> +other.time[i] return sgn unless sgn == 0 end if @time return 0 end |
#==(other) ⇒ Boolean
オブジェクトの同値
1155 1156 1157 1158 1159 |
# File 'lib/when_exe/tmobjects.rb', line 1155 def ==(other) (self <=> other) == 0 rescue false end |
#[](index) ⇒ Numeric
要素の参照
994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 |
# File 'lib/when_exe/tmobjects.rb', line 994 def [](index) if index == WEEK return nil unless @week return @week[0] elsif index <= 0 return nil unless @date return @date[index-1] else return nil unless @time return @time[index] end end |
#days ⇒ String
期間に含まれる日数を示す
1046 1047 1048 1049 |
# File 'lib/when_exe/tmobjects.rb', line 1046 def days return nil unless @date return @date[DAY-1].to_s end |
#designator ⇒ String
持続期間であることを文字‘P’で示す
1011 1012 1013 |
# File 'lib/when_exe/tmobjects.rb', line 1011 def designator return 'P' end |
#hours ⇒ String
期間に含まれる時間数を示す
1064 1065 1066 1067 |
# File 'lib/when_exe/tmobjects.rb', line 1064 def hours return nil unless @time return @time[HOUR].to_s end |
#minutes ⇒ String
期間に含まれる分数を示す
1073 1074 1075 1076 |
# File 'lib/when_exe/tmobjects.rb', line 1073 def minutes return nil unless @time return @time[MINUTE].to_s end |
#months ⇒ String
期間に含まれる月数を示す
1028 1029 1030 1031 |
# File 'lib/when_exe/tmobjects.rb', line 1028 def months return nil unless @date return @date[MONTH-1].to_s end |
#seconds ⇒ String
期間に含まれる秒数を示す
1082 1083 1084 1085 |
# File 'lib/when_exe/tmobjects.rb', line 1082 def seconds return nil unless @time return @time[SECOND].to_s end |
#sign ⇒ Integer
符号
1104 1105 1106 |
# File 'lib/when_exe/tmobjects.rb', line 1104 def sign @sign ||= _sign end |
#time_indicator ⇒ String Also known as: timeIndicator
期間が1日より短い時間単位を含むとき文字‘T’で示す
1055 1056 1057 |
# File 'lib/when_exe/tmobjects.rb', line 1055 def time_indicator return (@time) ? 'T' : nil end |
#to_period_duration ⇒ When::TM::PeriodDuration
When::TM::PeriodDuration への変換
単なるオブジェクトのコピー
1239 1240 1241 |
# File 'lib/when_exe/tmobjects.rb', line 1239 def to_period_duration self.dup end |
#to_s ⇒ String
文字列化
1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 |
# File 'lib/when_exe/tmobjects.rb', line 1212 def to_s period = 'P' if @week period += @week[0].abs.to_s + 'W' period += @week[1].abs.to_s + 'D' unless @week[1] == 0 elsif @date (-@date.length..-1).each do |i| period += @date[i].abs.to_s + PRECISION_NAME[i+1][0..0] unless @date[i] == 0 end end if @time period += 'T' (1..@time.length-1).each do |i| period += @time[i].abs.to_s + PRECISION_NAME[i][0..0] unless @time[i] == 0 end end period = '-' + period if sign < 0 period == 'P' ? 'P0D' : period end |
#weeks ⇒ String
期間に含まれる週数を示す
1037 1038 1039 1040 |
# File 'lib/when_exe/tmobjects.rb', line 1037 def weeks return nil unless @week return @week[0].to_s end |