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::DefaultDateIndex, Coordinates::DefaultTimeIndex, Coordinates::IndianCities, Coordinates::Javanese, Coordinates::MATCH, Coordinates::Mayan, Coordinates::PERIOD, Coordinates::PERIOD_NAME, Coordinates::PRECISION, Coordinates::PRECISION_NAME, Coordinates::VALUE, Coordinates::Yi
Constants included from When
CENTURY, DAY, DECADE, DurationP1D, DurationP1M, DurationP1W, DurationP1Y, EUCJP, HOUR, MINUTE, MONTH, 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, _free_conv, _parse, _setup_, at, client, config, era, free_conv, m17n, now, server, today, utc, when?
Methods inherited from Duration
#_enumerator, #abs, #after, #before, #coerce, dhms, #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
オブジェクトの生成
1203 1204 1205 1206 1207 1208 1209 1210 1211 |
# File 'lib/when_exe/tmobjects.rb', line 1203 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>
期間の日付要素
926 927 928 |
# File 'lib/when_exe/tmobjects.rb', line 926 def date @date end |
Class Method Details
._to_array(period) ⇒ Array<Numeric, Array<Numeric>>
ISO 8601 形式の表現を分解して配列化する
864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 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 |
# File 'lib/when_exe/tmobjects.rb', line 864 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
乗算
1138 1139 1140 1141 1142 1143 1144 |
# File 'lib/when_exe/tmobjects.rb', line 1138 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 と同じクラス
加算
1118 1119 1120 |
# File 'lib/when_exe/tmobjects.rb', line 1118 def +(other) other.kind_of?(When::TM::PeriodDuration) ? _plus(other, +1) : other + self end |
#-(other) ⇒ When::TM::PeriodDuration
減算
1128 1129 1130 |
# File 'lib/when_exe/tmobjects.rb', line 1128 def -(other) _plus(other, -1) end |
#-@ ⇒ When::TM::PeriodDuration
符号反転
1046 1047 1048 1049 1050 1051 1052 |
# File 'lib/when_exe/tmobjects.rb', line 1046 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
除算
1152 1153 1154 |
# File 'lib/when_exe/tmobjects.rb', line 1152 def /(divisor) self * (1.0 / divisor) end |
#<=>(other) ⇒ Integer
比較
1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 |
# File 'lib/when_exe/tmobjects.rb', line 1071 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
オブジェクトの同値
1104 1105 1106 1107 1108 |
# File 'lib/when_exe/tmobjects.rb', line 1104 def ==(other) (self <=> other) == 0 rescue false end |
#[](index) ⇒ Numeric
要素の参照
949 950 951 952 953 954 955 956 957 958 959 960 |
# File 'lib/when_exe/tmobjects.rb', line 949 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
期間に含まれる日数を示す
1001 1002 1003 1004 |
# File 'lib/when_exe/tmobjects.rb', line 1001 def days return nil unless (@date) return @date[DAY-1].to_s end |
#designator ⇒ String
持続期間であることを文字‘P’で示す
966 967 968 |
# File 'lib/when_exe/tmobjects.rb', line 966 def designator return 'P' end |
#hours ⇒ Numeric
期間に含まれる時間数を示す
1019 1020 1021 1022 |
# File 'lib/when_exe/tmobjects.rb', line 1019 def hours return nil unless (@time) return @time[HOUR].to_s end |
#minutes ⇒ Numeric
期間に含まれる分数を示す
1028 1029 1030 1031 |
# File 'lib/when_exe/tmobjects.rb', line 1028 def minutes return nil unless (@time) return @time[MINUTE].to_s end |
#months ⇒ Numeric
期間に含まれる月数を示す
983 984 985 986 |
# File 'lib/when_exe/tmobjects.rb', line 983 def months return nil unless (@date) return @date[MONTH-1].to_s end |
#seconds ⇒ Numeric
期間に含まれる秒数を示す
1037 1038 1039 1040 |
# File 'lib/when_exe/tmobjects.rb', line 1037 def seconds return nil unless (@time) return @time[SECOND].to_s end |
#sign ⇒ Integer
符号
1058 1059 1060 1061 1062 1063 |
# File 'lib/when_exe/tmobjects.rb', line 1058 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’で示す
1010 1011 1012 |
# File 'lib/when_exe/tmobjects.rb', line 1010 def time_indicator return (@time) ? 'T' : nil end |
#to_period_duration ⇒ When::TM::PeriodDuration
When::TM::PeriodDuration への変換
単なるオブジェクトのコピー
1187 1188 1189 |
# File 'lib/when_exe/tmobjects.rb', line 1187 def to_period_duration self.dup end |
#to_s ⇒ String
文字列化
1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 |
# File 'lib/when_exe/tmobjects.rb', line 1160 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
期間に含まれる週数を示す
992 993 994 995 |
# File 'lib/when_exe/tmobjects.rb', line 992 def weeks return nil unless (@week) return @week[0].to_s end |