Class: Date

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/date/format.rb,
lib/date/delta.rb,
lib/date/delta.rb,
lib/rubysl/date/date.rb,
lib/rubysl/date/date.rb,
lib/date/delta/parser.rb

Overview

Class representing a date.

See the documentation to the file date.rb for an overview.

Internally, the date is represented as an Astronomical Julian Day Number, ajd. The Day of Calendar Reform, sg, is also stored, for conversions to other date formats. (There is also an of field for a time zone offset, but this is only for the use of the DateTime subclass.)

A new Date object is created using one of the object creation class methods named after the corresponding date format, and the arguments appropriate to that date format; for instance, Date::civil() (aliased to Date::new()) with year, month, and day-of-month, or Date::ordinal() with year and day-of-year. All of these object creation class methods also take the Day of Calendar Reform as an optional argument.

Date objects are immutable once created.

Once a Date has been created, date values can be retrieved for the different date formats supported using instance methods. For instance, #mon() gives the Civil month, #cwday() gives the Commercial day of the week, and #yday() gives the Ordinal day of the year. Date values can be retrieved in any format, regardless of what format was used to create the Date instance.

The Date class includes the Comparable module, allowing date objects to be compared and sorted, ranges of dates to be created, and so forth.

Direct Known Subclasses

DateTime

Defined Under Namespace

Modules: Format Classes: Delta, Infinity

Constant Summary collapse

MONTHNAMES =

Full month names, in English. Months count from 1 to 12; a month’s numerical representation indexed into this array gives the name of that month (hence the first element is nil).

[nil] + %w(January February March April May June July
August September October November December)
DAYNAMES =

Full names of days of the week, in English. Days of the week count from 0 to 6 (except in the commercial week); a day’s numerical representation indexed into this array gives the name of that day.

%w(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)
ABBR_MONTHNAMES =

Abbreviated month names, in English.

[nil] + %w(Jan Feb Mar Apr May Jun
Jul Aug Sep Oct Nov Dec)
ABBR_DAYNAMES =

Abbreviated day names, in English.

%w(Sun Mon Tue Wed Thu Fri Sat)
ITALY =

The Julian Day Number of the Day of Calendar Reform for Italy and the Catholic countries.

2299161
ENGLAND =

The Julian Day Number of the Day of Calendar Reform for England and her Colonies.

2361222
JULIAN =

A constant used to indicate that a Date should always use the Julian calendar.

Infinity.new
GREGORIAN =

A constant used to indicate that a Date should always use the Gregorian calendar.

-Infinity.new
HALF_DAYS_IN_DAY =

:nodoc:

Rational(1, 2)
HOURS_IN_DAY =

:nodoc:

Rational(1, 24)
MINUTES_IN_DAY =

:nodoc:

Rational(1, 1440)
SECONDS_IN_DAY =

:nodoc:

Rational(1, 86400)
MILLISECONDS_IN_DAY =

:nodoc:

Rational(1, 86400*10**3)
NANOSECONDS_IN_DAY =

:nodoc:

Rational(1, 86400*10**9)
MILLISECONDS_IN_SECOND =

:nodoc:

Rational(1, 10**3)
NANOSECONDS_IN_SECOND =

:nodoc:

Rational(1, 10**9)
MJD_EPOCH_IN_AJD =

1858-11-17 # :nodoc:

Rational(4800001, 2)
UNIX_EPOCH_IN_AJD =

1970-01-01 # :nodoc:

Rational(4881175, 2)
MJD_EPOCH_IN_CJD =

:nodoc:

2400001
UNIX_EPOCH_IN_CJD =

:nodoc:

2440588
LD_EPOCH_IN_CJD =

:nodoc:

2299160

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(ajd = 0, of = 0, sg = ITALY) ⇒ Date

NOTE this is the documentation for the method new!(). If you are reading this as the documentation for new(), that is because rdoc doesn’t fully support the aliasing of the initialize() method. new() is in fact an alias for #civil(): read the documentation for that method instead.

Create a new Date object.

ajd is the Astronomical Julian Day Number. of is the offset from UTC as a fraction of a day. Both default to 0.

sg specifies the Day of Calendar Reform to use for this Date object.

Using one of the factory methods such as Date::civil is generally easier and safer.



1141
1142
1143
1144
# File 'lib/rubysl/date/date.rb', line 1141

def initialize(ajd=0, of=0, sg=ITALY)
  @ajd, @of, @sg = ajd, of, sg
  @__ca__ = {}
end

Class Method Details

._httpdate(str) ⇒ Object

:nodoc:



1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
# File 'lib/date/format.rb', line 1210

def self._httpdate(str) # :nodoc:
  if /\A\s*(#{Format::ABBR_DAYS.keys.join('|')})\s*,\s+
	\d{2}\s+
	(#{Format::ABBR_MONTHS.keys.join('|')})\s+
	-?\d{4}\s+ # allow minus, anyway
	\d{2}:\d{2}:\d{2}\s+
	gmt\s*\z/iox =~ str
    _rfc2822(str)
  elsif /\A\s*(#{Format::DAYS.keys.join('|')})\s*,\s+
	\d{2}\s*-\s*
	(#{Format::ABBR_MONTHS.keys.join('|')})\s*-\s*
	\d{2}\s+
	\d{2}:\d{2}:\d{2}\s+
	gmt\s*\z/iox =~ str
    _parse(str)
  elsif /\A\s*(#{Format::ABBR_DAYS.keys.join('|')})\s+
	(#{Format::ABBR_MONTHS.keys.join('|')})\s+
	\d{1,2}\s+
	\d{2}:\d{2}:\d{2}\s+
	\d{4}\s*\z/iox =~ str
    _parse(str)
  end
end

._iso8601(str) ⇒ Object

:nodoc:



1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
# File 'lib/date/format.rb', line 1111

def self._iso8601(str) # :nodoc:
  if /\A\s*(([-+]?\d{2,}|-)-\d{2}-\d{2}|
     ([-+]?\d{2,})?-\d{3}|
     (\d{2}|\d{4})?-w\d{2}-\d|
     -w-\d)
	(t
	\d{2}:\d{2}(:\d{2}([,.]\d+)?)?
	(z|[-+]\d{2}(:?\d{2})?)?)?\s*\z/ix =~ str
    _parse(str)
  elsif /\A\s*(([-+]?(\d{2}|\d{4})|--)\d{2}\d{2}|
     ([-+]?(\d{2}|\d{4}))?\d{3}|-\d{3}|
     (\d{2}|\d{4})?w\d{2}\d)
	(t?
	\d{2}\d{2}(\d{2}([,.]\d+)?)?
	(z|[-+]\d{2}(\d{2})?)?)?\s*\z/ix =~ str
    _parse(str)
  elsif /\A\s*(\d{2}:\d{2}(:\d{2}([,.]\d+)?)?
	(z|[-+]\d{2}(:?\d{2})?)?)?\s*\z/ix =~ str
    _parse(str)
  elsif /\A\s*(\d{2}\d{2}(\d{2}([,.]\d+)?)?
	(z|[-+]\d{2}(\d{2})?)?)?\s*\z/ix =~ str
    _parse(str)
  end
end

._jisx0301(str) ⇒ Object

:nodoc:



1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
# File 'lib/date/format.rb', line 1234

def self._jisx0301(str) # :nodoc:
  if /\A\s*[mtsh]?\d{2}\.\d{2}\.\d{2}
	(t
	(\d{2}:\d{2}(:\d{2}([,.]\d*)?)?
	(z|[-+]\d{2}(:?\d{2})?)?)?)?\s*\z/ix =~ str
    if /\A\s*\d/ =~ str
	_parse(str.sub(/\A\s*(\d)/, 'h\1'))
    else
	_parse(str)
    end
  else
    _iso8601(str)
  end
end

._parse(str, comp = true) ⇒ Object



1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
# File 'lib/date/format.rb', line 1045

def self._parse(str, comp=true)
  str = str.dup

  e = Format::Bag.new

  e._comp = comp

  str.gsub!(/[^-+',.\/:@[:alnum:]\[\]]+/, ' ')

  _parse_time(str, e) # || _parse_beat(str, e)
  _parse_day(str, e)

  _parse_eu(str, e)     ||
  _parse_us(str, e)     ||
  _parse_iso(str, e)    ||
  _parse_jis(str, e)    ||
  _parse_vms(str, e)    ||
  _parse_sla(str, e)    ||
  _parse_dot(str, e)    ||
  _parse_iso2(str, e)   ||
  _parse_year(str, e)   ||
  _parse_mon(str, e)    ||
  _parse_mday(str, e)   ||
  _parse_ddd(str, e)

  if str.sub!(/\b(bc\b|bce\b|b\.c\.|b\.c\.e\.)/i, ' ')
    if e.year
	e.year = -e.year + 1
    end
  end

  if str.sub!(/\A\s*(\d{1,2})\s*\z/, ' ')
    if e.hour && !e.mday
	v = $1.to_i
	if (1..31) === v
 e.mday = v
	end
    end
    if e.mday && !e.hour
	v = $1.to_i
	if (0..24) === v
 e.hour = v
	end
    end
  end

  if e._comp
    if e[:cwyear]
	if e[:cwyear] >= 0 && e[:cwyear] <= 99
 e[:cwyear] += if e[:cwyear] >= 69
      then 1900 else 2000 end
	end
    end
    if e.year
	if e.year >= 0 && e.year <= 99
 e.year += if e.year >= 69
    then 1900 else 2000 end
	end
    end
  end

  e.offset ||= zone_to_diff(e.zone) if e.zone

  e.to_hash
end

._rfc2822(str) ⇒ Object Also known as: _rfc822

:nodoc:



1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
# File 'lib/date/format.rb', line 1189

def self._rfc2822(str) # :nodoc:
  if /\A\s*(?:(?:#{Format::ABBR_DAYS.keys.join('|')})\s*,\s+)?
	\d{1,2}\s+
	(?:#{Format::ABBR_MONTHS.keys.join('|')})\s+
	-?(\d{2,})\s+ # allow minus, anyway
	\d{2}:\d{2}(:\d{2})?\s*
	(?:[-+]\d{4}|ut|gmt|e[sd]t|c[sd]t|m[sd]t|p[sd]t|[a-ik-z])\s*\z/iox =~ str
    e = _parse(str, false)
    if $1.size < 4
	if e[:year] < 50
 e[:year] += 2000
	elsif e[:year] < 1000
 e[:year] += 1900
	end
    end
    e
  end
end

._rfc3339(str) ⇒ Object

:nodoc:



1136
1137
1138
1139
1140
1141
1142
1143
# File 'lib/date/format.rb', line 1136

def self._rfc3339(str) # :nodoc:
  if /\A\s*-?\d{4}-\d{2}-\d{2} # allow minus, anyway
	(t|\s)
	\d{2}:\d{2}:\d{2}(\.\d+)?
	(z|[-+]\d{2}:\d{2})\s*\z/ix =~ str
    _parse(str)
  end
end

._strptime(str, fmt = '%F') ⇒ Object



589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
# File 'lib/date/format.rb', line 589

def self._strptime(str, fmt='%F')
  str = str.dup
  e = Format::Bag.new
  return unless _strptime_i(str, fmt, e)

  if e._cent
    if e[:cwyear]
	e[:cwyear] += e._cent * 100
    end
    if e.year
	e.  year += e._cent * 100
    end
  end

  if e._merid
    if e.hour
	e.hour %= 12
	e.hour += e._merid
    end
  end

  unless str.empty?
    e[:leftover] = str
  end

  e.to_hash
end

._xmlschema(str) ⇒ Object

:nodoc:



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
1180
1181
1182
1183
1184
1185
1186
1187
# File 'lib/date/format.rb', line 1145

def self._xmlschema(str) # :nodoc:
  if /\A\s*(-?\d{4,})(?:-(\d{2})(?:-(\d{2}))?)?
	(?:t
 (\d{2}):(\d{2}):(\d{2})(?:\.(\d+))?)?
	(z|[-+]\d{2}:\d{2})?\s*\z/ix =~ str
    e = Format::Bag.new
    e.year = $1.to_i
    e.mon = $2.to_i if $2
    e.mday = $3.to_i if $3
    e.hour = $4.to_i if $4
    e.min = $5.to_i if $5
    e.sec = $6.to_i if $6
    e.sec_fraction = Rational($7.to_i, 10**$7.size) if $7
    if $8
	e.zone = $8
	e.offset = zone_to_diff($8)
    end
    e.to_hash
  elsif /\A\s*(\d{2}):(\d{2}):(\d{2})(?:\.(\d+))?
	(z|[-+]\d{2}:\d{2})?\s*\z/ix =~ str
    e = Format::Bag.new
    e.hour = $1.to_i if $1
    e.min = $2.to_i if $2
    e.sec = $3.to_i if $3
    e.sec_fraction = Rational($4.to_i, 10**$4.size) if $4
    if $5
	e.zone = $5
	e.offset = zone_to_diff($5)
    end
    e.to_hash
  elsif /\A\s*(?:--(\d{2})(?:-(\d{2}))?|---(\d{2}))
	(z|[-+]\d{2}:\d{2})?\s*\z/ix =~ str
    e = Format::Bag.new
    e.mon = $1.to_i if $1
    e.mday = $2.to_i if $2
    e.mday = $3.to_i if $3
    if $4
	e.zone = $4
	e.offset = zone_to_diff($4)
    end
    e.to_hash
  end
end

.civil(y = -4712,, m = 1, d = 1, sg = ITALY) ⇒ Object

Create a new Date object for the Civil Date specified by year y, month m, and day-of-month d.

m and d can be negative, in which case they count backwards from the end of the year and the end of the month respectively. No wraparound is performed, however, and invalid values cause an ArgumentError to be raised. can be negative

y defaults to -4712, m to 1, and d to 1; this is Julian Day Number day 0.

sg specifies the Day of Calendar Reform.



810
811
812
813
814
815
# File 'lib/rubysl/date/date.rb', line 810

def self.civil(y=-4712, m=1, d=1, sg=ITALY)
  unless jd = _valid_civil?(y, m, d, sg)
    raise ArgumentError, 'invalid date'
  end
  new!(jd_to_ajd(jd, 0, 0), 0, sg)
end

.commercial(y = -4712,, w = 1, d = 1, sg = ITALY) ⇒ Object

Create a new Date object for the Commercial Date specified by year y, week-of-year w, and day-of-week d.

Monday is day-of-week 1; Sunday is day-of-week 7.

w and d can be negative, in which case they count backwards from the end of the year and the end of the week respectively. No wraparound is performed, however, and invalid values cause an ArgumentError to be raised.

y defaults to -4712, w to 1, and d to 1; this is Julian Day Number day 0.

sg specifies the Day of Calendar Reform.



833
834
835
836
837
838
# File 'lib/rubysl/date/date.rb', line 833

def self.commercial(y=-4712, w=1, d=1, sg=ITALY)
  unless jd = _valid_commercial?(y, w, d, sg)
    raise ArgumentError, 'invalid date'
  end
  new!(jd_to_ajd(jd, 0, 0), 0, sg)
end

.gregorian_leap?(y) ⇒ Boolean Also known as: leap?

Is a year a leap year in the Gregorian calendar?

All years divisible by 4 are leap years in the Gregorian calendar, except for years divisible by 100 and not by 400.

Returns:

  • (Boolean)


728
# File 'lib/rubysl/date/date.rb', line 728

def self.gregorian_leap? (y) y % 4 == 0 && y % 100 != 0 || y % 400 == 0 end

.httpdate(str = 'Mon, 01 Jan -4712 00:00:00 GMT', sg = ITALY) ⇒ Object

:nodoc:



1094
1095
1096
1097
# File 'lib/rubysl/date/date.rb', line 1094

def self.httpdate(str='Mon, 01 Jan -4712 00:00:00 GMT', sg=ITALY) # :nodoc:
  elem = _httpdate(str)
  new_by_frags(elem, sg)
end

.iso8601(str = '-4712-01-01', sg = ITALY) ⇒ Object

:nodoc:



1072
1073
1074
1075
# File 'lib/rubysl/date/date.rb', line 1072

def self.iso8601(str='-4712-01-01', sg=ITALY) # :nodoc:
  elem = _iso8601(str)
  new_by_frags(elem, sg)
end

.jd(jd = 0, sg = ITALY) ⇒ Object

Create a new Date object from a Julian Day Number.

jd is the Julian Day Number; if not specified, it defaults to 0. sg specifies the Day of Calendar Reform.



775
776
777
778
# File 'lib/rubysl/date/date.rb', line 775

def self.jd(jd=0, sg=ITALY)
  jd = _valid_jd?(jd, sg)
  new!(jd_to_ajd(jd, 0, 0), 0, sg)
end

.jisx0301(str = '-4712-01-01', sg = ITALY) ⇒ Object

:nodoc:



1099
1100
1101
1102
# File 'lib/rubysl/date/date.rb', line 1099

def self.jisx0301(str='-4712-01-01', sg=ITALY) # :nodoc:
  elem = _jisx0301(str)
  new_by_frags(elem, sg)
end

.julian_leap?(y) ⇒ Boolean

Is a year a leap year in the Julian calendar?

All years divisible by 4 are leap years in the Julian calendar.

Returns:

  • (Boolean)


722
# File 'lib/rubysl/date/date.rb', line 722

def self.julian_leap? (y) y % 4 == 0 end

.newObject Also known as: new!

Create a new Date object for the Civil Date specified by year y, month m, and day-of-month d.

m and d can be negative, in which case they count backwards from the end of the year and the end of the month respectively. No wraparound is performed, however, and invalid values cause an ArgumentError to be raised. can be negative

y defaults to -4712, m to 1, and d to 1; this is Julian Day Number day 0.

sg specifies the Day of Calendar Reform.



817
818
819
820
821
822
# File 'lib/rubysl/date/date.rb', line 817

def self.civil(y=-4712, m=1, d=1, sg=ITALY)
  unless jd = _valid_civil?(y, m, d, sg)
    raise ArgumentError, 'invalid date'
  end
  new!(jd_to_ajd(jd, 0, 0), 0, sg)
end

.once(*ids) ⇒ Object

:nodoc: – restricted



1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
# File 'lib/rubysl/date/date.rb', line 1106

def once(*ids) # :nodoc: -- restricted
  for id in ids
	module_eval <<-"end;"
	  alias_method :__#{id.object_id}__, :#{id.to_s}
	  private :__#{id.object_id}__
	  def #{id.to_s}(*args)
 @__ca__[#{id.object_id}] ||= __#{id.object_id}__(*args)
	  end
	end;
  end
end

.ordinal(y = -4712,, d = 1, sg = ITALY) ⇒ Object

Create a new Date object from an Ordinal Date, specified by year y and day-of-year d. d can be negative, in which it counts backwards from the end of the year. No year wraparound is performed, however. An invalid value for d results in an ArgumentError being raised.

y defaults to -4712, and d to 1; this is Julian Day Number day 0.

sg specifies the Day of Calendar Reform.



790
791
792
793
794
795
# File 'lib/rubysl/date/date.rb', line 790

def self.ordinal(y=-4712, d=1, sg=ITALY)
  unless jd = _valid_ordinal?(y, d, sg)
    raise ArgumentError, 'invalid date'
  end
  new!(jd_to_ajd(jd, 0, 0), 0, sg)
end

.parse(str = '-4712-01-01', comp = true, sg = ITALY) ⇒ Object

Create a new Date object by parsing from a String, without specifying the format.

str is a String holding a date representation. comp specifies whether to interpret 2-digit years as 19XX (>= 69) or 20XX (< 69); the default is not to. The method will attempt to parse a date from the String using various heuristics; see #_parse in date/format.rb for more details. If parsing fails, an ArgumentError will be raised.

The default str is ‘-4712-01-01’; this is Julian Day Number day 0.

sg specifies the Day of Calendar Reform.



1067
1068
1069
1070
# File 'lib/rubysl/date/date.rb', line 1067

def self.parse(str='-4712-01-01', comp=true, sg=ITALY)
  elem = _parse(str, comp)
  new_by_frags(elem, sg)
end

.rfc2822(str = 'Mon, 1 Jan -4712 00:00:00 +0000', sg = ITALY) ⇒ Object Also known as: rfc822

:nodoc:



1087
1088
1089
1090
# File 'lib/rubysl/date/date.rb', line 1087

def self.rfc2822(str='Mon, 1 Jan -4712 00:00:00 +0000', sg=ITALY) # :nodoc:
  elem = _rfc2822(str)
  new_by_frags(elem, sg)
end

.rfc3339(str = '-4712-01-01T00:00:00+00:00', sg = ITALY) ⇒ Object

:nodoc:



1077
1078
1079
1080
# File 'lib/rubysl/date/date.rb', line 1077

def self.rfc3339(str='-4712-01-01T00:00:00+00:00', sg=ITALY) # :nodoc:
  elem = _rfc3339(str)
  new_by_frags(elem, sg)
end

.strptime(str = '-4712-01-01', fmt = '%F', sg = ITALY) ⇒ Object

Create a new Date object by parsing from a String according to a specified format.

str is a String holding a date representation. fmt is the format that the date is in. See date/format.rb for details on supported formats.

The default str is ‘-4712-01-01’, and the default fmt is ‘%F’, which means Year-Month-Day_of_Month. This gives Julian Day Number day 0.

sg specifies the Day of Calendar Reform.

An ArgumentError will be raised if str cannot be parsed.



1047
1048
1049
1050
# File 'lib/rubysl/date/date.rb', line 1047

def self.strptime(str='-4712-01-01', fmt='%F', sg=ITALY)
  elem = _strptime(str, fmt)
  new_by_frags(elem, sg)
end

.today(sg = ITALY) ⇒ Object

Create a new Date object representing today.

sg specifies the Day of Calendar Reform.



1813
1814
1815
1816
1817
# File 'lib/rubysl/date/date.rb', line 1813

def self.today(sg=ITALY)
  t = Time.now
  jd = civil_to_jd(t.year, t.mon, t.mday, sg)
  new!(jd_to_ajd(jd, 0, 0), 0, sg)
end

.valid_civil?(y, m, d, sg = ITALY) ⇒ Boolean Also known as: valid_date?

Returns:

  • (Boolean)


742
743
744
# File 'lib/rubysl/date/date.rb', line 742

def self.valid_civil? (y, m, d, sg=ITALY)
  !!_valid_civil?(y, m, d, sg)
end

.valid_commercial?(y, w, d, sg = ITALY) ⇒ Boolean

Returns:

  • (Boolean)


748
749
750
# File 'lib/rubysl/date/date.rb', line 748

def self.valid_commercial? (y, w, d, sg=ITALY)
  !!_valid_commercial?(y, w, d, sg)
end

.valid_jd?(jd, sg = ITALY) ⇒ Boolean

Returns:

  • (Boolean)


733
734
735
736
# File 'lib/rubysl/date/date.rb', line 733

def self.valid_jd? (jd, sg=ITALY)
  return false if jd.nil?
  true
end

.valid_ordinal?(y, d, sg = ITALY) ⇒ Boolean

Returns:

  • (Boolean)


738
739
740
# File 'lib/rubysl/date/date.rb', line 738

def self.valid_ordinal? (y, d, sg=ITALY)
  !!_valid_ordinal?(y, d, sg)
end

.xmlschema(str = '-4712-01-01', sg = ITALY) ⇒ Object

:nodoc:



1082
1083
1084
1085
# File 'lib/rubysl/date/date.rb', line 1082

def self.xmlschema(str='-4712-01-01', sg=ITALY) # :nodoc:
  elem = _xmlschema(str)
  new_by_frags(elem, sg)
end

Instance Method Details

#+(n) ⇒ Object

Return a new Date object that is n days later than the current one.

n may be a negative value, in which case the new Date is earlier than the current one; however, #-() might be more intuitive.

If n is not a Numeric, a TypeError will be thrown. In particular, two Dates cannot be added to each other.

Raises:

  • (TypeError)


1339
1340
1341
1342
1343
1344
1345
1346
1347
# File 'lib/rubysl/date/date.rb', line 1339

def + (n)
  case n
  when Numeric; return self.class.new!(@ajd + n, @of, @sg)
  when Delta
    d = n.__send__(:delta)
    return (self >> d.imag) + d.real
  end
  raise TypeError, 'expected numeric'
end

#-(x) ⇒ Object

If x is a Numeric value, create a new Date object that is x days earlier than the current one.

If x is a Date, return the number of days between the two dates; or, more precisely, how many days later the current date is than x.

If x is neither Numeric nor a Date, a TypeError is raised.

Raises:

  • (TypeError)


1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
# File 'lib/rubysl/date/date.rb', line 1354

def - (x)
  case x
  when Numeric; return self.class.new!(@ajd - x, @of, @sg)
  when Date;    return @ajd - x.ajd
  when Delta
    d = x.__send__(:delta)
    return (self << d.imag) - d.real
  end
  raise TypeError, 'expected numeric'
end

#<<(n) ⇒ Object

Return a new Date object that is n months earlier than the current one.

If the day-of-the-month of the current Date is greater than the last day of the target month, the day-of-the-month of the returned Date will be the last day of the target month.



1438
# File 'lib/rubysl/date/date.rb', line 1438

def << (n) self >> -n end

#<=>(other) ⇒ Object

Compare this date with another date.

other can also be a Numeric value, in which case it is interpreted as an Astronomical Julian Day Number.

Comparison is by Astronomical Julian Day Number, including fractional days. This means that both the time and the timezone offset are taken into account when comparing two DateTime instances. When comparing a DateTime instance with a Date instance, the time of the latter will be considered as falling on midnight UTC.



1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
# File 'lib/rubysl/date/date.rb', line 1373

def <=> (other)
  case other
  when Numeric; return @ajd <=> other
  when Date;    return @ajd <=> other.ajd
  else
    begin
      l, r = other.coerce(self)
      return l <=> r
    rescue NoMethodError
    end
  end
  nil
end

#===(other) ⇒ Object

The relationship operator for Date.

Compares dates by Julian Day Number. When comparing two DateTime instances, or a DateTime with a Date, the instances will be regarded as equivalent if they fall on the same date in local time.



1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
# File 'lib/rubysl/date/date.rb', line 1393

def === (other)
  case other
  when Numeric; return jd == other
  when Date;    return jd == other.jd
  else
    begin
	l, r = other.coerce(self)
	return l === r
    rescue NoMethodError
    end
  end
  false
end

#>>(n) ⇒ Object

Return a new Date object that is n months later than the current one.

If the day-of-the-month of the current Date is greater than the last day of the target month, the day-of-the-month of the returned Date will be the last day of the target month.



1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
# File 'lib/rubysl/date/date.rb', line 1421

def >> (n)
  y, m = (year * 12 + (mon - 1) + n).divmod(12)
  m,   = (m + 1)                    .divmod(1)
  d = mday
  until jd2 = _valid_civil?(y, m, d, @sg)
    d -= 1
    raise ArgumentError, 'invalid date' unless d > 0
  end
  self + (jd2 - jd)
end

#ajdObject

Get the date as an Astronomical Julian Day Number.



1147
# File 'lib/rubysl/date/date.rb', line 1147

def ajd() @ajd end

#amjdObject

Get the date as an Astronomical Modified Julian Day Number.



1150
# File 'lib/rubysl/date/date.rb', line 1150

def amjd() ajd_to_amjd(@ajd) end

#asctimeObject Also known as: ctime

alias_method :format, :strftime



352
# File 'lib/date/format.rb', line 352

def asctime() strftime('%c') end

#cwdayObject

Get the commercial day of the week of this date. Monday is commercial day-of-week 1; Sunday is commercial day-of-week 7.



1247
# File 'lib/rubysl/date/date.rb', line 1247

def cwday() commercial[2] end

#cweekObject

Get the commercial week of the year of this date.



1243
# File 'lib/rubysl/date/date.rb', line 1243

def cweek() commercial[1] end

#cwyearObject

Get the commercial year of this date. See Commercial Date in the introduction for how this differs from the normal year.



1240
# File 'lib/rubysl/date/date.rb', line 1240

def cwyear() commercial[0] end

#day_fractionObject

Get any fractional day part of the date.



1158
# File 'lib/rubysl/date/date.rb', line 1158

def day_fraction() ajd_to_jd(@ajd, @of)[1] end

#downto(min, &block) ⇒ Object

Step backward one day at a time until we reach min (inclusive), yielding each date as we go.



1476
1477
1478
# File 'lib/rubysl/date/date.rb', line 1476

def downto(min, &block) # :yield: date
  step(min, -1, &block)
end

#englandObject

Create a copy of this Date object that uses the English/Colonial Day of Calendar Reform.



1309
# File 'lib/rubysl/date/date.rb', line 1309

def england() new_start(self.class::ENGLAND) end

#eql?(other) ⇒ Boolean

Is this Date equal to other?

other must both be a Date object, and represent the same date.

Returns:

  • (Boolean)


1483
# File 'lib/rubysl/date/date.rb', line 1483

def eql? (other) Date === other && self == other end

#gregorianObject

Create a copy of this Date object that always uses the Gregorian Calendar.



1317
# File 'lib/rubysl/date/date.rb', line 1317

def gregorian() new_start(self.class::GREGORIAN) end

#gregorian?Boolean

Is the current date new-style (Gregorian Calendar)?

Returns:

  • (Boolean)


1277
# File 'lib/rubysl/date/date.rb', line 1277

def gregorian? () !julian? end

#hashObject

Calculate a hash value for this date.



1486
# File 'lib/rubysl/date/date.rb', line 1486

def hash() @ajd.hash end

#httpdateObject

:nodoc:



366
# File 'lib/date/format.rb', line 366

def httpdate() new_offset(0).strftime('%a, %d %b %Y %T GMT') end

#inspectObject

Return internal object state as a programmer-readable string.



1489
1490
1491
# File 'lib/rubysl/date/date.rb', line 1489

def inspect
  format('#<%s: %s (%s,%s,%s)>', self.class, to_s, @ajd, @of, @sg)
end

#iso8601Object



356
# File 'lib/date/format.rb', line 356

def iso8601() strftime('%F') end

#italyObject

Create a copy of this Date object that uses the Italian/Catholic Day of Calendar Reform.



1305
# File 'lib/rubysl/date/date.rb', line 1305

def italy() new_start(self.class::ITALY) end

#jdObject

Get the date as a Julian Day Number.



1155
# File 'lib/rubysl/date/date.rb', line 1155

def jd() ajd_to_jd(@ajd, @of)[0] end

#jisx0301Object



368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
# File 'lib/date/format.rb', line 368

def jisx0301
  if jd < 2405160
    iso8601
  else
    case jd
    when 2405160...2419614
	g = 'M%02d' % (year - 1867)
    when 2419614...2424875
	g = 'T%02d' % (year - 1911)
    when 2424875...2447535
	g = 'S%02d' % (year - 1925)
    else
	g = 'H%02d' % (year - 1988)
    end
    g + strftime('.%m.%d')
  end
end

#julianObject

Create a copy of this Date object that always uses the Julian Calendar.



1313
# File 'lib/rubysl/date/date.rb', line 1313

def julian() new_start(self.class::JULIAN) end

#julian?Boolean

Is the current date old-style (Julian Calendar)?

Returns:

  • (Boolean)


1274
# File 'lib/rubysl/date/date.rb', line 1274

def julian? () jd < @sg end

#ldObject

Get the date as the number of days since the Day of Calendar Reform (in Italy and the Catholic countries).



1165
# File 'lib/rubysl/date/date.rb', line 1165

def ld() jd_to_ld(jd) end

#leap?Boolean

Is this a leap year?

Returns:

  • (Boolean)


1290
1291
1292
1293
# File 'lib/rubysl/date/date.rb', line 1290

def leap?
  jd_to_civil(civil_to_jd(year, 3, 1, fix_style) - 1,
fix_style)[-1] == 29
end

#marshal_dumpObject

Dump to Marshal format.



1499
1500
1501
# File 'lib/rubysl/date/date.rb', line 1499

def marshal_dump()
  [0, @ajd, 0, 0, @of, @sg]
end

#marshal_load(a) ⇒ Object

Load from Marshal format.



1504
1505
1506
1507
# File 'lib/rubysl/date/date.rb', line 1504

def marshal_load(a)
  _, @ajd, _, _, @of, @sg, = a
  @__ca__ = {}
end

#mdayObject Also known as: day

Get the day-of-the-month of this date.



1198
# File 'lib/rubysl/date/date.rb', line 1198

def mday() civil[2] end

#mjdObject

Get the date as a Modified Julian Day Number.



1161
# File 'lib/rubysl/date/date.rb', line 1161

def mjd() jd_to_mjd(jd) end

#monObject Also known as: month

Get the month of this date.

January is month 1.



1195
# File 'lib/rubysl/date/date.rb', line 1195

def mon() civil[1] end

#new_start(sg = self.class::ITALY) ⇒ Object

Create a copy of this Date object using a new Day of Calendar Reform.



1301
# File 'lib/rubysl/date/date.rb', line 1301

def new_start(sg=self.class::ITALY) self.class.new!(@ajd, @of, sg) end

#nextObject Also known as: succ

Return a new Date one day after this one.



1411
# File 'lib/rubysl/date/date.rb', line 1411

def next() next_day end

#next_day(n = 1) ⇒ Object



1407
# File 'lib/rubysl/date/date.rb', line 1407

def next_day(n=1) self + n end

#next_month(n = 1) ⇒ Object



1440
# File 'lib/rubysl/date/date.rb', line 1440

def next_month(n=1) self >> n end

#next_year(n = 1) ⇒ Object



1443
# File 'lib/rubysl/date/date.rb', line 1443

def next_year(n=1) self >> n * 12 end

#prev_day(n = 1) ⇒ Object



1408
# File 'lib/rubysl/date/date.rb', line 1408

def prev_day(n=1) self - n end

#prev_month(n = 1) ⇒ Object



1441
# File 'lib/rubysl/date/date.rb', line 1441

def prev_month(n=1) self << n end

#prev_year(n = 1) ⇒ Object



1444
# File 'lib/rubysl/date/date.rb', line 1444

def prev_year(n=1) self << n * 12 end

#rfc2822Object



362
# File 'lib/date/format.rb', line 362

def rfc2822() strftime('%a, %-d %b %Y %T %z') end

#rfc3339Object



358
# File 'lib/date/format.rb', line 358

def rfc3339() iso8601 end

#rfc822Object



364
# File 'lib/date/format.rb', line 364

def rfc2822() strftime('%a, %-d %b %Y %T %z') end

#startObject

When is the Day of Calendar Reform for this Date object?



1298
# File 'lib/rubysl/date/date.rb', line 1298

def start() @sg end

#step(limit, step = 1) ⇒ Object

Step the current date forward step days at a time (or backward, if step is negative) until we reach limit (inclusive), yielding the resultant date at each step.



1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
# File 'lib/rubysl/date/date.rb', line 1450

def step(limit, step=1) # :yield: date
=begin
  if step.zero?
    raise ArgumentError, "step can't be 0"
  end
=end
  unless block_given?
    return to_enum(:step, limit, step)
  end
  da = self
  op = %w(- <= >=)[step <=> 0]
  while da.__send__(op, limit)
    yield da
    da += step
  end
  self
end

#strftime(fmt = '%F') ⇒ Object



226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
# File 'lib/date/format.rb', line 226

def strftime(fmt='%F')
  fmt.gsub(/%([-_0^#]+)?(\d+)?([EO]?(?::{1,3}z|.))/m) do
    f = {}
    m = $&
    s, w, c = $1, $2, $3
    if s
	s.scan(/./) do |k|
 case k
 when '-'; f[:p] = '-'
 when '_'; f[:p] = "\s" unless f[:p] == '-'
 when '0'; f[:p] = '0'  unless f[:p] == '-'
 when '^'; f[:u] = true
 when '#'; f[:x] = true
 end
	end
    end
    if w
	f[:w] = w.to_i
    end
    case c
    when 'A'; emit_ad(DAYNAMES[wday], 0, f)
    when 'a'; emit_ad(ABBR_DAYNAMES[wday], 0, f)
    when 'B'; emit_ad(MONTHNAMES[mon], 0, f)
    when 'b'; emit_ad(ABBR_MONTHNAMES[mon], 0, f)
    when 'C', 'EC'; emit_sn((year / 100).floor, 2, f)
    when 'c', 'Ec'; emit_a(strftime('%a %b %e %H:%M:%S %Y'), 0, f)
    when 'D'; emit_a(strftime('%m/%d/%y'), 0, f)
    when 'd', 'Od'; emit_n(mday, 2, f)
    when 'e', 'Oe'; emit_a(mday, 2, f)
    when 'F'
	if m == '%F'
 format('%.4d-%02d-%02d', year, mon, mday) # 4p
	else
 emit_a(strftime('%Y-%m-%d'), 0, f)
	end
    when 'G'; emit_sn(cwyear, 4, f)
    when 'g'; emit_n(cwyear % 100, 2, f)
    when 'H', 'OH'; emit_n(hour, 2, f)
    when 'h'; emit_ad(strftime('%b'), 0, f)
    when 'I', 'OI'; emit_n((hour % 12).nonzero? || 12, 2, f)
    when 'j'; emit_n(yday, 3, f)
    when 'k'; emit_a(hour, 2, f)
    when 'L'
	f[:p] = nil
	w = f[:w] || 3
	u = 10**w
	emit_n((sec_fraction * u).floor, w, f)
    when 'l'; emit_a((hour % 12).nonzero? || 12, 2, f)
    when 'M', 'OM'; emit_n(min, 2, f)
    when 'm', 'Om'; emit_n(mon, 2, f)
    when 'N'
	f[:p] = nil
	w = f[:w] || 9
	u = 10**w
	emit_n((sec_fraction * u).floor, w, f)
    when 'n'; emit_a("\n", 0, f)
    when 'P'; emit_ad(strftime('%p').downcase, 0, f)
    when 'p'; emit_au(if hour < 12 then 'AM' else 'PM' end, 0, f)
    when 'Q'
	s = ((ajd - UNIX_EPOCH_IN_AJD) / MILLISECONDS_IN_DAY).round
	emit_sn(s, 1, f)
    when 'R'; emit_a(strftime('%H:%M'), 0, f)
    when 'r'; emit_a(strftime('%I:%M:%S %p'), 0, f)
    when 'S', 'OS'; emit_n(sec, 2, f)
    when 's'
	s = ((ajd - UNIX_EPOCH_IN_AJD) / SECONDS_IN_DAY).round
	emit_sn(s, 1, f)
    when 'T'
	if m == '%T'
 format('%02d:%02d:%02d', hour, min, sec) # 4p
	else
 emit_a(strftime('%H:%M:%S'), 0, f)
	end
    when 't'; emit_a("\t", 0, f)
    when 'U', 'W', 'OU', 'OW'
	emit_n(if c[-1,1] == 'U' then wnum0 else wnum1 end, 2, f)
    when 'u', 'Ou'; emit_n(cwday, 1, f)
    when 'V', 'OV'; emit_n(cweek, 2, f)
    when 'v'; emit_a(strftime('%e-%b-%Y'), 0, f)
    when 'w', 'Ow'; emit_n(wday, 1, f)
    when 'X', 'EX'; emit_a(strftime('%H:%M:%S'), 0, f)
    when 'x', 'Ex'; emit_a(strftime('%m/%d/%y'), 0, f)
    when 'Y', 'EY'; emit_sn(year, 4, f)
    when 'y', 'Ey', 'Oy'; emit_n(year % 100, 2, f)
    when 'Z'; emit_au(strftime('%:z'), 0, f)
    when /\A(:{0,3})z/
	t = $1.size
	sign = if offset < 0 then -1 else +1 end
	fr = offset.abs
	ss = fr.div(SECONDS_IN_DAY) # 4p
	hh, ss = ss.divmod(3600)
	mm, ss = ss.divmod(60)
	if t == 3
 if    ss.nonzero? then t =  2
 elsif mm.nonzero? then t =  1
 else                   t = -1
 end
	end
	case t
	when -1
 tail = []
 sep = ''
	when 0
 f[:w] -= 2 if f[:w]
 tail = ['%02d' % mm]
 sep = ''
	when 1
 f[:w] -= 3 if f[:w]
 tail = ['%02d' % mm]
 sep = ':'
	when 2
 f[:w] -= 6 if f[:w]
 tail = ['%02d' % mm, '%02d' % ss]
 sep = ':'
	end
	([emit_z(sign * hh, 2, f)] + tail).join(sep)
    when '%'; emit_a('%', 0, f)
    when '+'; emit_a(strftime('%a %b %e %H:%M:%S %Z %Y'), 0, f)
    else
	m
    end
  end
end

#to_dateObject



1807
# File 'lib/rubysl/date/date.rb', line 1807

def to_date() self end

#to_datetimeObject



1808
# File 'lib/rubysl/date/date.rb', line 1808

def to_datetime() DateTime.new!(jd_to_ajd(jd, 0, 0), @of, @sg) end

#to_sObject

Return the date as a human-readable string.

The format used is YYYY-MM-DD.



1496
# File 'lib/rubysl/date/date.rb', line 1496

def to_s() format('%.4d-%02d-%02d', year, mon, mday) end

#to_timeObject



1806
# File 'lib/rubysl/date/date.rb', line 1806

def to_time() Time.local(year, mon, mday) end

#upto(max, &block) ⇒ Object

Step forward one day at a time until we reach max (inclusive), yielding each date as we go.



1470
1471
1472
# File 'lib/rubysl/date/date.rb', line 1470

def upto(max, &block) # :yield: date
  step(max, +1, &block)
end

#wdayObject

Get the week day of this date. Sunday is day-of-week 0; Saturday is day-of-week 6.



1251
# File 'lib/rubysl/date/date.rb', line 1251

def wday() jd_to_wday(jd) end

#xmlschemaObject

:nodoc:



360
# File 'lib/date/format.rb', line 360

def xmlschema() iso8601 end

#ydayObject

Get the day-of-the-year of this date.

January 1 is day-of-the-year 1



1190
# File 'lib/rubysl/date/date.rb', line 1190

def yday() ordinal[1] end

#yearObject

Get the year of this date.



1185
# File 'lib/rubysl/date/date.rb', line 1185

def year() civil[0] end