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::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 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
期間の時刻要素.
-
#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 ⇒ Numeric
期間に含まれる日数を示す.
-
#designator ⇒ String
持続期間であることを文字‘P’で示す.
-
#hours ⇒ Numeric
期間に含まれる時間数を示す.
-
#initialize(*args) ⇒ PeriodDuration
constructor
オブジェクトの生成.
-
#minutes ⇒ Numeric
期間に含まれる分数を示す.
-
#months ⇒ Numeric
期間に含まれる月数を示す.
-
#seconds ⇒ Numeric
期間に含まれる秒数を示す.
-
#sign ⇒ Integer
符号.
-
#time_indicator ⇒ String
(also: #timeIndicator)
期間が1日より短い時間単位を含むとき文字‘T’で示す.
-
#to_period_duration ⇒ When::TM::PeriodDuration
When::TM::PeriodDuration への変換.
-
#to_s ⇒ String
文字列化.
-
#weeks ⇒ Numeric
期間に含まれる週数を示す.
-
#years ⇒ Numeric
期間に含まれる年数を示す.
Methods included from Coordinates
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 inherited from Duration
#_enumerator, #abs, #after, #before, #coerce, dhms, #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
オブジェクトの生成
1235 1236 1237 1238 1239 1240 1241 1242 1243 |
# File 'lib/when_exe/tmobjects.rb', line 1235 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>
期間の日付要素
958 959 960 |
# File 'lib/when_exe/tmobjects.rb', line 958 def date @date end |
Class Method Details
._to_array(period) ⇒ Array<Numeric, Array<Numeric>>
ISO 8601 形式の表現を分解して配列化する
896 897 898 899 900 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 |
# File 'lib/when_exe/tmobjects.rb', line 896 def self._to_array(period) return nil unless period.gsub(/_+/, '') =~ /^([-+])?P(.*?)?(?:T(.+))?$/ sign = ($1 == '-') ? -1 : +1 pdate, ptime = $~[2..3] # 時分秒形式 if (ptime =~ /^(?:([.,\d]+)?([:*=])?H)?(?:([.,\d]+)?([:*=])?M)?(?:([.,\d]+)?([:*=])?S)?((?:[.,\d]*[:*=]?X)*)$/) 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 /^((?:[.,\d]*[-*=]?X)*)(?:([.,\d]+)?([-*=])?Y)?(?:([.,\d]+)?([-+*&%!>=<?])?M)?(?:([.,\d]+)?([-*=?%])?D)?$/ 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 /^(?:([.,\d]+)?([:*=])?W)(?:([.,\d]+)?([-*=?%])?D)?$/ 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
乗算
1170 1171 1172 1173 1174 1175 1176 |
# File 'lib/when_exe/tmobjects.rb', line 1170 def *(times) period = self.dup period.date = @date.map {|v| v *= times; v.to_i==v.to_f ? v.to_i : v} if @date period.week = @week.map {|v| v *= times; v.to_i==v.to_f ? v.to_i : v} if @week period.time = @time.map {|v| v *= times; v.to_i==v.to_f ? v.to_i : v} if @time return period end |
#+(other) ⇒ WWhen::TM::PeriodDuration, other と同じクラス
加算
1150 1151 1152 |
# File 'lib/when_exe/tmobjects.rb', line 1150 def +(other) other.kind_of?(When::TM::PeriodDuration) ? _plus(other, +1) : other + self end |
#-(other) ⇒ When::TM::PeriodDuration
減算
1160 1161 1162 |
# File 'lib/when_exe/tmobjects.rb', line 1160 def -(other) _plus(other, -1) end |
#-@ ⇒ When::TM::PeriodDuration
符号反転
1078 1079 1080 1081 1082 1083 1084 |
# File 'lib/when_exe/tmobjects.rb', line 1078 def -@ period = self.dup period.date = @date.map {|v| -v} if @date period.week = @week.map {|v| -v} if @week period.time = @time.map {|v| -v} if @time return period end |
#/(divisor) ⇒ When::TM::PeriodDuration
除算
1184 1185 1186 |
# File 'lib/when_exe/tmobjects.rb', line 1184 def /(divisor) self * (1.0 / divisor) end |
#<=>(other) ⇒ Integer
比較
1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 |
# File 'lib/when_exe/tmobjects.rb', line 1103 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
オブジェクトの同値
1136 1137 1138 1139 1140 |
# File 'lib/when_exe/tmobjects.rb', line 1136 def ==(other) (self <=> other) == 0 rescue false end |
#[](index) ⇒ Numeric
要素の参照
981 982 983 984 985 986 987 988 989 990 991 992 |
# File 'lib/when_exe/tmobjects.rb', line 981 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 ⇒ Numeric
期間に含まれる日数を示す
1033 1034 1035 1036 |
# File 'lib/when_exe/tmobjects.rb', line 1033 def days return nil unless (@date) return @date[DAY-1].to_s end |
#designator ⇒ String
持続期間であることを文字‘P’で示す
998 999 1000 |
# File 'lib/when_exe/tmobjects.rb', line 998 def designator return 'P' end |
#hours ⇒ Numeric
期間に含まれる時間数を示す
1051 1052 1053 1054 |
# File 'lib/when_exe/tmobjects.rb', line 1051 def hours return nil unless (@time) return @time[HOUR].to_s end |
#minutes ⇒ Numeric
期間に含まれる分数を示す
1060 1061 1062 1063 |
# File 'lib/when_exe/tmobjects.rb', line 1060 def minutes return nil unless (@time) return @time[MINUTE].to_s end |
#months ⇒ Numeric
期間に含まれる月数を示す
1015 1016 1017 1018 |
# File 'lib/when_exe/tmobjects.rb', line 1015 def months return nil unless (@date) return @date[MONTH-1].to_s end |
#seconds ⇒ Numeric
期間に含まれる秒数を示す
1069 1070 1071 1072 |
# File 'lib/when_exe/tmobjects.rb', line 1069 def seconds return nil unless (@time) return @time[SECOND].to_s end |
#sign ⇒ Integer
符号
1090 1091 1092 1093 1094 1095 |
# File 'lib/when_exe/tmobjects.rb', line 1090 def sign ((@week || @date || []) + (@time || [])).each do |v| return -1 if +v < 0 end return +1 end |
#time_indicator ⇒ String Also known as: timeIndicator
期間が1日より短い時間単位を含むとき文字‘T’で示す
1042 1043 1044 |
# File 'lib/when_exe/tmobjects.rb', line 1042 def time_indicator return (@time) ? 'T' : nil end |
#to_period_duration ⇒ When::TM::PeriodDuration
When::TM::PeriodDuration への変換
単なるオブジェクトのコピー
1219 1220 1221 |
# File 'lib/when_exe/tmobjects.rb', line 1219 def to_period_duration self.dup end |
#to_s ⇒ String
文字列化
1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 |
# File 'lib/when_exe/tmobjects.rb', line 1192 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 ⇒ Numeric
期間に含まれる週数を示す
1024 1025 1026 1027 |
# File 'lib/when_exe/tmobjects.rb', line 1024 def weeks return nil unless (@week) return @week[0].to_s end |