Class: When::TM::CalDate
- Inherits:
-
TemporalPosition
- Object
- TemporalPosition
- When::TM::CalDate
- Defined in:
- lib/when_exe/tmposition.rb,
lib/when_exe/inspect.rb
Overview
暦日
see gml schema
Direct Known Subclasses
Constant Summary collapse
- SearchOption =
検索オプション
{After=>[0, -2, Before], Before=>[-2, 0, After]}
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::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
-
#cal_date ⇒ Array<Numeric>
(also: #calDate)
readonly
日付要素.
-
#calendar_era ⇒ When::TM::CalendarEra
(also: #calendarEra)
暦年代.
-
#calendar_era_name ⇒ Array
(also: #calendarEraName)
暦年代名.
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
-
#%(other) ⇒ Numeric
ユリウス日または通年の剰余.
-
#&(other) ⇒ When::TM::CalDate
ユリウス日または通年が指定の剰余となる日.
-
#_attr ⇒ Object
属性の Hash.
-
#_date_to_s(precision) ⇒ String
日付の年号以外の部分を文字列化する.
-
#_event_form(other = nil) ⇒ String
event を 文字列化 - 日時で与えられた event を文字列化する.
-
#_to_hash(options = {}) ⇒ Hash
Hash 化.
-
#calendar_name ⇒ Array
暦法名.
-
#ceil(digit = DAY, precision = digit) ⇒ When::TM::CalDate
下位桁の切り上げ.
-
#clock ⇒ Object
時法の取得 - ダミー.
-
#cwday ⇒ Numeric
七曜(暦週).
-
#cweek(d = 0) ⇒ Numeric
暦週.
-
#cwyear(d = 0) ⇒ Numeric
暦週の年.
-
#day(d = 0) ⇒ Numeric
日.
-
#floor(digit = DAY, precision = digit) ⇒ When::TM::CalDate
下位桁の切り捨て.
-
#leaf? ⇒ Boolean
暦年代が末端の参照であるか?.
-
#least_significant_coordinate ⇒ Numeric
最下位の要素.
-
#length(upper, lower = DAY) ⇒ Integer
要素数 ― 上位要素に含まれる下位要素の数.
-
#mday(d = 0) ⇒ Numeric
月内通日.
-
#month(d = 0) ⇒ Numeric
(also: #mon)
月.
-
#most_significant_coordinate ⇒ Numeric
最上位の要素.
-
#mweek(w = 6, m = 7, d = 0) ⇒ Numeric
月内通週.
-
#name(index, format = nil) ⇒ When::BasicTypes::M17n
要素の多言語対応文字列化.
-
#reference_label ⇒ When::BasicTypes::M17n
参照ラベル.
-
#to_i ⇒ Integer
ユリウス日.
-
#to_m17n(precision = @precision) ⇒ When::BasicTypes::M17n
多言語対応文字列化 - When.exe Standard Representation により多言語対応文字列化する.
-
#to_residue(remainder, divisor) ⇒ When::Coordinates::Residue
剰余類化.
-
#to_s(precision = @precision) ⇒ String
文字列化 - When.exe Standard Representation により文字列化する.
-
#universal_time ⇒ Numeric
内部時間.
-
#value(index) ⇒ Numeric
要素の参照.
-
#wday ⇒ Numeric
七曜.
-
#yday(d = 0) ⇒ Numeric
年内通日.
-
#year(d = 0) ⇒ Numeric
年.
-
#ymon(d1 = 0, d2 = 0) ⇒ Numeric
年内通月.
-
#yweek(w = 6, m = 7, d = 0) ⇒ Numeric
年内通週.
Methods inherited from TemporalPosition
#+, #+@, #-, #<=>, #[], #^, _instance, #_notes, _options, _setup_, #_to_s, #clock_name, #copy, #dynamical_time, #has_next?, #has_time?, #include?, #is?, #month_included, #note?, #notes, #period, #prev, #rate_of_clock, #scan, #strftime, #succ, #term, #time_standard, #to_clock_time, #to_date, #to_date_time, #to_date_uri, #to_f, #to_time, #to_uri, #week_included, #year_included
Methods included from Coordinates
Methods included from When
Calendar, CalendarEra, CalendarNote, Clock, Duration, M17n, MonthName, Pair, Residue, Resource, TemporalPosition, _free_conv, _parse, _setup_, _to_string, _to_symbol, at, client, config, era, free_conv, m17n, now, server, today, utc, when?
Methods included from TemporalPosition::Conversion
Methods included from Parts::Resource
#[], #^, _extract_prefix, _instance, _parse, _path_with_prefix, _setup_, #each, #enum_for, #hierarchy, #include?, #included?, #iri, #m17n, #map, #next, #parent, #prev, #registered?
Methods included from Parts::Resource::Pool
#[], #[]=, #_pool, #_setup_, #pool_keys
Methods included from Parts::Resource::Synchronize
Dynamic Method Handling
This class handles dynamic methods through the method_missing method in the class When::TM::TemporalPosition
Instance Attribute Details
#cal_date ⇒ Array<Numeric> (readonly) Also known as: calDate
ISO19108 では sequence<Integer> だが、閏月などが表現可能なよう Numeric としている。
日付要素
1378 1379 1380 |
# File 'lib/when_exe/tmposition.rb', line 1378 def cal_date @cal_date end |
#calendar_era ⇒ When::TM::CalendarEra Also known as: calendarEra
暦年代
1404 1405 1406 |
# File 'lib/when_exe/tmposition.rb', line 1404 def calendar_era @calendar_era end |
#calendar_era_name ⇒ Array Also known as: calendarEraName
暦年代名
1397 1398 1399 |
# File 'lib/when_exe/tmposition.rb', line 1397 def calendar_era_name @calendar_era_name end |
Instance Method Details
#%(other) ⇒ Numeric
ユリウス日または通年の剰余
1520 1521 1522 1523 1524 1525 1526 1527 |
# File 'lib/when_exe/tmposition.rb', line 1520 def %(other) raise TypeError,"The right operand should be When::Coordinates::Residue" unless other.kind_of?(Residue) case other.event when 'day' ; other % least_significant_coordinate when 'year' ; other % (most_significant_coordinate + @frame._diff_to_CE) else ; raise ArgumentError,"The right operand should have a unit 'day' or 'year'" end end |
#&(other) ⇒ When::TM::CalDate
ユリウス日または通年が指定の剰余となる日
1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 |
# File 'lib/when_exe/tmposition.rb', line 1492 def &(other) raise TypeError,"The right operand should be When::Coordinates::Residue" unless other.kind_of?(Residue) case other.event when 'day' # 指定の剰余となる日 other -= @frame.indices[-1].shift unless @frame.indices[-1].shift == 0 date = @frame.to_cal_date(other & to_i) date[0] -= @calendar_era_name[1] if @calendar_era_name return self.dup._copy({:events=>nil, :query=>@query, :validate=>:done, :date=>date}) when 'year' # 指定の剰余となる年 date = @cal_date.dup date[0] = (other & (most_significant_coordinate + @frame._diff_to_CE)) - @frame._diff_to_CE date[0] -= @calendar_era_name[1] if @calendar_era_name return self.dup._copy({:date=>date, :events=>nil, :query=>@query}) else raise ArgumentError,"The right operand should have a unit 'day' or 'year'" end end |
#_attr ⇒ Object
属性の Hash
1589 1590 1591 |
# File 'lib/when_exe/tmposition.rb', line 1589 def _attr super.merge({:era_name=>@calendar_era_name, :era=>@calendar_era}) end |
#_date_to_s(precision) ⇒ String
日付の年号以外の部分を文字列化する
1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 |
# File 'lib/when_exe/inspect.rb', line 1142 def _date_to_s(precision) # 準備 precision = [precision, 1 - @cal_date.length].max precision = [precision, DAY].min terms = [] format = "" # 年 year_by_epoch = @cal_date[0] if (@calendar_era_name) era, epoch, reverse = @calendar_era_name year_in_term = reverse ? -year_by_epoch : year_by_epoch year_by_calendar = epoch + year_by_epoch if epoch terms << year_in_term format += (0..99) === (year_in_term * 1) ? "%02d." : "%04d." if year_by_calendar && year_by_calendar != year_in_term terms << (year_by_calendar * 1) format += "(%04d)" end else terms << year_by_epoch format += (0..9999) === (year_by_epoch * 1) ? "%04d." : "%06d." end # 月日 ((1-@cal_date.length)..-1).each do |i| break if (i >= precision) terms << @cal_date[i] format += "%02d." end # 結果 date = Pair._format([format] + terms) date.sub!(/([^\d])\(([-+\d]+)\)/, '(\2)\1') if era date = date[0..-2] unless @frame.pair[precision-1] || date[-1..-1] != '.' date.gsub!(/\./, '-') if (@frame.indices.length <= DefaultDateIndices.length) && !era return date end |
#_event_form(other = nil) ⇒ String
events 配列なし - 日時をそのまま文字列化 日時の精度が日より細かい - イベント名(イベント時刻) 日時の精度が日 - イベント名(当日までの経過日数)
event を 文字列化 - 日時で与えられた event を文字列化する
1127 1128 1129 1130 1131 1132 1133 1134 |
# File 'lib/when_exe/inspect.rb', line 1127 def _event_form(other=nil) return to_m17n unless events return events[0] + '(' + clk_time.to_s[/[:*=0-9]+/] + ')' if precision > When::DAY return events[0] unless other other = JulianDate.dynamical_time(other.dynamical_time, {:time_standard=>time_standard}) unless time_standard.rate_of_clock == other.time_standard.rate_of_clock events[0] + '(' + (other.to_i - to_i).to_s + ')' end |
#_to_hash(options = {}) ⇒ Hash
Hash 化
926 927 928 |
# File 'lib/when_exe/inspect.rb', line 926 def _to_hash(={}) super.update({:cal_date=>@cal_date}) end |
#calendar_name ⇒ Array
暦法名
882 883 884 885 886 887 |
# File 'lib/when_exe/inspect.rb', line 882 def calendar_name void, epoch, reverse, back = @calendar_era_name name = [@calendar_era || @frame, epoch, reverse, back] name.pop until name[-1] return name end |
#ceil(digit = DAY, precision = digit) ⇒ When::TM::CalDate
下位桁の切り上げ
1551 1552 1553 |
# File 'lib/when_exe/tmposition.rb', line 1551 def ceil(digit=DAY, precision=digit) (self + PeriodDuration.new(1, digit, (-@frame.indices.length)..0)).floor(digit, precision) end |
#clock ⇒ Object
時法の取得 - ダミー
1408 1409 1410 |
# File 'lib/when_exe/tmposition.rb', line 1408 def clock nil end |
#cwday ⇒ Numeric
七曜(暦週)
996 997 998 |
# File 'lib/when_exe/inspect.rb', line 996 def cwday (to_i % 7) + 1 end |
#cweek(d = 0) ⇒ Numeric
暦週
1006 1007 1008 1009 1010 1011 1012 |
# File 'lib/when_exe/inspect.rb', line 1006 def cweek(d=0) [1,0,-1].each do |i| start = ((self + PeriodDuration.new(i, YEAR-d)).floor(YEAR-d,DAY) + PeriodDuration.new(4, DAY)) & Residue.new(0,7,-1) return ((to_i - start.to_i).div 7) + 1 if self >= start end raise IndexError, 'Cannot decide year number' end |
#cwyear(d = 0) ⇒ Numeric
暦週の年
1082 1083 1084 1085 1086 1087 1088 |
# File 'lib/when_exe/inspect.rb', line 1082 def cwyear(d=0) [1,0,-1].each do |i| start = ((self + PeriodDuration.new(i, YEAR-d)).floor(YEAR-d,DAY) + PeriodDuration.new(4, DAY)) & Residue.new(0,7,-1) return year(d)+i if self >= start end raise IndexError, 'Cannot decide year number' end |
#day(d = 0) ⇒ Numeric
日
960 961 962 |
# File 'lib/when_exe/inspect.rb', line 960 def day(d=0) @cal_date[DAY-1-d] end |
#floor(digit = DAY, precision = digit) ⇒ When::TM::CalDate
下位桁の切り捨て
1537 1538 1539 1540 1541 |
# File 'lib/when_exe/tmposition.rb', line 1537 def floor(digit=DAY, precision=digit) = {:date=>@cal_date[0..(digit-1)], :events=>nil, :query=>nil} [:precision] = precision if precision self.dup._copy() end |
#leaf? ⇒ Boolean
暦年代が末端の参照であるか?
1579 1580 1581 1582 1583 1584 1585 |
# File 'lib/when_exe/tmposition.rb', line 1579 def leaf? name, = @calendar_era_name return true unless name.respond_to?(:_pool) era = name._pool['..'] return true unless era.respond_to?(:leaf?) return era.leaf? end |
#least_significant_coordinate ⇒ Numeric
最下位の要素
1482 1483 1484 |
# File 'lib/when_exe/tmposition.rb', line 1482 def least_significant_coordinate return to_i + @frame.indices[-1].shift end |
#length(upper, lower = DAY) ⇒ Integer
要素数 ― 上位要素に含まれる下位要素の数
1562 1563 1564 1565 1566 |
# File 'lib/when_exe/tmposition.rb', line 1562 def length(upper, lower=DAY) range = [floor(upper).to_i, ceil(upper).to_i] range = range.map {|d| (Residue.mod(d) {|m| frame._new_month(m)})[0]} if lower == MONTH range[1] - range[0] end |
#mday(d = 0) ⇒ Numeric
月内通日
970 971 972 |
# File 'lib/when_exe/inspect.rb', line 970 def mday(d=0) to_i - floor(MONTH-d).to_i + 1 end |
#month(d = 0) ⇒ Numeric Also known as: mon
月
1045 1046 1047 |
# File 'lib/when_exe/inspect.rb', line 1045 def month(d=0) @cal_date[MONTH-1-d] end |
#most_significant_coordinate ⇒ Numeric
最上位の要素
1468 1469 1470 1471 1472 1473 1474 1475 |
# File 'lib/when_exe/tmposition.rb', line 1468 def most_significant_coordinate coordinate = @cal_date[0] coordinate += @calendar_era_name[1] if @calendar_era_name @frame.index_of_MSC.times do |i| coordinate = +coordinate * @frame.indices[i].unit + @cal_date[i+1] - @frame.indices[i].base end coordinate end |
#mweek(w = 6, m = 7, d = 0) ⇒ Numeric
月内通週
1022 1023 1024 |
# File 'lib/when_exe/inspect.rb', line 1022 def mweek(w=6, m=7, d=0) 1 + (to_i - (floor(MONTH-d,DAY) & Residue.new(w,m)).to_i).div(7) end |
#name(index, format = nil) ⇒ When::BasicTypes::M17n
要素の多言語対応文字列化
937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 |
# File 'lib/when_exe/inspect.rb', line 937 def name(index, format=nil) digit = _digit(index) {|digit| digit <= DAY} coordinate = @cal_date[digit-1] 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||0]) end |
#reference_label ⇒ When::BasicTypes::M17n
参照ラベル
894 895 896 897 898 |
# File 'lib/when_exe/inspect.rb', line 894 def reference_label return @calendar_era.hierarchy.map {|e| e.label} if @calendar_era return [@frame.label] if @frame.label [When::BasicTypes::M17n.new(@frame.class.to_s.split(/::/)[-1])] end |
#to_i ⇒ Integer
ユリウス日
1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 |
# File 'lib/when_exe/tmposition.rb', line 1429 def to_i return @sdn if @sdn name, base = @calendar_era_name if base date = @cal_date.dup date[0] += base else date = @cal_date end @sdn = @frame.to_julian_date(date) end |
#to_m17n(precision = @precision) ⇒ When::BasicTypes::M17n
多言語対応文字列化 - When.exe Standard Representation により多言語対応文字列化する
1096 1097 1098 1099 1100 1101 |
# File 'lib/when_exe/inspect.rb', line 1096 def to_m17n(precision=@precision) era, = @calendar_era_name date = _date_to_s(precision) return m17n(date) unless era return m17n(era) + date end |
#to_residue(remainder, divisor) ⇒ When::Coordinates::Residue
剰余類化
1448 1449 1450 1451 |
# File 'lib/when_exe/tmposition.rb', line 1448 def to_residue(remainder, divisor) When::Coordinates::Residue.new(remainder, divisor, {'day' => least_significant_coordinate, 'year' => most_significant_coordinate}) end |
#to_s(precision = @precision) ⇒ String
文字列化 - When.exe Standard Representation により文字列化する
1109 1110 1111 1112 1113 1114 |
# File 'lib/when_exe/inspect.rb', line 1109 def to_s(precision=@precision) era, = @calendar_era_name date = _date_to_s(precision) return date unless era return era.to_s + date end |
#universal_time ⇒ Numeric
内部時間
1418 1419 1420 1421 |
# File 'lib/when_exe/tmposition.rb', line 1418 def universal_time return super if [Now, Max, Min].include?(@indeterminated_position) @universal_time ||= JulianDate._d_to_t(to_i) end |
#value(index) ⇒ Numeric
要素の参照
1459 1460 1461 |
# File 'lib/when_exe/tmposition.rb', line 1459 def value(index) @cal_date[(_digit(index) {|digit| digit <= DAY})-1] end |
#wday ⇒ Numeric
七曜
988 989 990 |
# File 'lib/when_exe/inspect.rb', line 988 def wday (to_i + 1) % 7 end |
#yday(d = 0) ⇒ Numeric
年内通日
980 981 982 |
# File 'lib/when_exe/inspect.rb', line 980 def yday(d=0) to_i - floor(YEAR-d).to_i + 1 end |
#year(d = 0) ⇒ Numeric
年
1072 1073 1074 |
# File 'lib/when_exe/inspect.rb', line 1072 def year(d=0) @cal_date[YEAR-1-d] end |
#ymon(d1 = 0, d2 = 0) ⇒ Numeric
年内通月
1057 1058 1059 1060 1061 1062 1063 1064 |
# File 'lib/when_exe/inspect.rb', line 1057 def ymon(d1=0, d2=0) current = floor(YEAR-d1, MONTH-d2) @frame._length(@cal_date[(YEAR-1-d1)...(MONTH-1-d2)]).times do |i| return i+1 if current == self current = current.succ end raise IndexError, 'Cannot decide month number' end |
#yweek(w = 6, m = 7, d = 0) ⇒ Numeric
年内通週
1035 1036 1037 |
# File 'lib/when_exe/inspect.rb', line 1035 def yweek(w=6, m=7, d=0) 1 + (to_i - (floor(YEAR-d,DAY) & Residue.new(w,m)).to_i).div(7) end |