Object
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.
format.rb: Written by Tadayoshi Funaba 1999-2009 $Id: format.rb,v 2.43 2008-01-17 20:16:31+09 tadf Exp $
Abbreviated day names, in English.
Abbreviated month names, in English.
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.
The Julian Day Number of the Day of Calendar Reform for England and her Colonies.
A constant used to indicate that a Date should always use the Gregorian calendar.
The Julian Day Number of the Day of Calendar Reform for Italy and the Catholic countries.
A constant used to indicate that a Date should always use the Julian calendar.
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).
# File date/format.rb, line 1030
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\.)/, ' ')
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
# File date/format.rb, line 574
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
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.
# File date.rb, line 807
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
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.
# File date.rb, line 830
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
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.
# File date.rb, line 726
def self.gregorian_leap? (y) y % 4 == 0 && y % 100 != 0 || y % 400 == 0 end
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.
# File date.rb, line 772
def self.jd(jd=0, sg=ITALY)
jd = _valid_jd?(jd, sg)
new!(jd_to_ajd(jd, 0, 0), 0, sg)
end
Is a year a leap year in the Julian calendar?
All years divisible by 4 are leap years in the Julian calendar.
# File date.rb, line 720
def self.julian_leap? (y) y % 4 == 0 end
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.
# File date.rb, line 1138
def initialize(ajd=0, of=0, sg=ITALY)
@ajd, @of, @sg = ajd, of, sg
@__ca__ = {}
end
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.
# File date.rb, line 787
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
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.
# File date.rb, line 1064
def self.parse(str='-4712-01-01', comp=true, sg=ITALY)
elem = _parse(str, comp)
new_by_frags(elem, sg)
end
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.
# File date.rb, line 1044
def self.strptime(str='-4712-01-01', fmt='%F', sg=ITALY)
elem = _strptime(str, fmt)
new_by_frags(elem, sg)
end
Create a new Date object representing today.
sg specifies the Day of Calendar Reform.
# File date.rb, line 1810
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
# File date.rb, line 739
def self.valid_civil? (y, m, d, sg=ITALY)
!!_valid_civil?(y, m, d, sg)
end
# File date.rb, line 745
def self.valid_commercial? (y, w, d, sg=ITALY)
!!_valid_commercial?(y, w, d, sg)
end
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.
# File date.rb, line 1336
def + (n)
case n
when Numeric; return self.class.new!(@ajd + n, @of, @sg)
end
raise TypeError, 'expected numeric'
end
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.
# File date.rb, line 1351
def - (x)
case x
when Numeric; return self.class.new!(@ajd - x, @of, @sg)
when Date; return @ajd - x.ajd
end
raise TypeError, 'expected numeric or date'
end
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.
# File date.rb, line 1435
def << (n) self >> -n end
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.
# File date.rb, line 1370
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
# File date/delta.rb, line 334
def == (other)
case other
when Numeric; return @delta == other
when Delta; return @delta == other
else
begin
l, r = other.coerce(self)
return l == r
rescue NoMethodError
end
end
nil
end
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.
# File date.rb, line 1390
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
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.
# File date.rb, line 1418
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
Is jd a valid Julian Day Number?
If it is, returns it. In fact, any value is treated as a valid Julian Day Number.
# File date.rb, line 575
def _valid_jd? (jd, sg=GREGORIAN) jd end
Get the date as an Astronomical Julian Day Number.
# File date.rb, line 1144
def ajd() @ajd end
Convert an Astronomical Julian Day Number to an Astronomical Modified Julian Day Number.
# File date.rb, line 548
def ajd_to_amjd(ajd) ajd - MJD_EPOCH_IN_AJD end
Convert an Astronomical Julian Day Number to a (civil) Julian Day Number.
ajd is the Astronomical Julian Day Number to convert. of is the offset from UTC as a fraction of a day (defaults to 0).
Returns the (civil) Julian Day Number as [day_number, fraction] where fraction is always 1/2.
# File date.rb, line 502
def ajd_to_jd(ajd, of=0) (ajd + of + HALF_DAYS_IN_DAY).divmod(1) end
Get the date as an Astronomical Modified Julian Day Number.
# File date.rb, line 1147
def amjd() ajd_to_amjd(@ajd) end
Convert an Astronomical Modified Julian Day Number to an Astronomical Julian Day Number.
# File date.rb, line 544
def amjd_to_ajd(amjd) amjd + MJD_EPOCH_IN_AJD end
alias_method :format, :strftime
# File date/format.rb, line 341
def asctime() strftime('%c') end
# File date/delta.rb, line 348
def coerce(other)
case other
when Numeric; return other, @delta
else
super
end
end
Get the commercial day of the week of this date. Monday is commercial day-of-week 1; Sunday is commercial day-of-week 7.
# File date.rb, line 1244
def cwday() commercial[2] end
Get the commercial week of the year of this date.
# File date.rb, line 1240
def cweek() commercial[1] end
Get the commercial year of this date. See Commercial Date in the introduction for how this differs from the normal year.
# File date.rb, line 1237
def cwyear() commercial[0] end
Get any fractional day part of the date.
# File date.rb, line 1155
def day_fraction() ajd_to_jd(@ajd, @of)[1] end
# File date/delta.rb, line 296
def divmod(n) [div(n), modulo(n)] end
Step backward one day at a time until we reach min (inclusive), yielding each date as we go.
# File date.rb, line 1475
def downto(min, &block) # :yield: date
step(min, -1, &block)
end
Create a copy of this Date object that uses the English/Colonial Day of Calendar Reform.
# File date.rb, line 1306
def england() new_start(self.class::ENGLAND) end
Create a copy of this Date object that always uses the Gregorian Calendar.
# File date.rb, line 1314
def gregorian() new_start(self.class::GREGORIAN) end
Is the current date new-style (Gregorian Calendar)?
# File date.rb, line 1274
def gregorian? () !julian? end
Calculate a hash value for this date.
# File date.rb, line 1485
def hash() @ajd.hash end
Get the hour of this date.
# File date.rb, line 1213
def hour() time[0] end
# File date/format.rb, line 355
def httpdate() new_offset(0).strftime('%a, %d %b %Y %T GMT') end
Return internal object state as a programmer-readable string.
# File date.rb, line 1488
def inspect
format('#<%s: %s (%s,%s,%s)>', self.class, to_s, @ajd, @of, @sg)
end
# File date/delta.rb, line 242
def integer? () @delta.imag == 0 && @delta.real.integer? end
Create a copy of this Date object that uses the Italian/Catholic Day of Calendar Reform.
# File date.rb, line 1302
def italy() new_start(self.class::ITALY) end
Get the date as a Julian Day Number.
# File date.rb, line 1152
def jd() ajd_to_jd(@ajd, @of)[0] end
Convert a (civil) Julian Day Number to an Astronomical Julian Day Number.
jd is the Julian Day Number to convert, and fr is a fractional day. of is the offset from UTC as a fraction of a day (defaults to 0).
Returns the Astronomical Julian Day Number as a single numeric value.
# File date.rb, line 513
def jd_to_ajd(jd, fr, of=0) jd + fr - of - HALF_DAYS_IN_DAY end
Convert a Julian Day Number to the number of days since the adoption of the Gregorian Calendar (in Italy).
# File date.rb, line 564
def jd_to_ld(jd) jd - LD_EPOCH_IN_CJD end
Convert a Julian Day Number to a Modified Julian Day Number.
# File date.rb, line 556
def jd_to_mjd(jd) jd - MJD_EPOCH_IN_CJD end
Convert a Julian Day Number to the day of the week.
Sunday is day-of-week 0; Saturday is day-of-week 6.
# File date.rb, line 569
def jd_to_wday(jd) (jd + 1) % 7 end
# File date/format.rb, line 357
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
Create a copy of this Date object that always uses the Julian Calendar.
# File date.rb, line 1310
def julian() new_start(self.class::JULIAN) end
Is the current date old-style (Julian Calendar)?
# File date.rb, line 1271
def julian? () jd < @sg end
Get the date as the number of days since the Day of Calendar Reform (in Italy and the Catholic countries).
# File date.rb, line 1162
def ld() jd_to_ld(jd) end
Convert a count of the number of days since the adoption of the Gregorian Calendar (in Italy) to a Julian Day Number.
# File date.rb, line 560
def ld_to_jd(ld) ld + LD_EPOCH_IN_CJD end
Is this a leap year?
# File date.rb, line 1287
def leap?
jd_to_civil(civil_to_jd(year, 3, 1, fix_style) - 1,
fix_style)[-1] == 29
end
Dump to Marshal format.
# File date.rb, line 1498
def marshal_dump() [@ajd, @of, @sg] end
Load from Marshal format.
# File date.rb, line 1501
def marshal_load(a)
@ajd, @of, @sg, = a
@__ca__ = {}
end
Get the day-of-the-month of this date.
# File date.rb, line 1195
def mday() civil[2] end
Get the minute of this date.
# File date.rb, line 1216
def min() time[1] end
Get the date as a Modified Julian Day Number.
# File date.rb, line 1158
def mjd() jd_to_mjd(jd) end
Convert a Modified Julian Day Number to a Julian Day Number.
# File date.rb, line 552
def mjd_to_jd(mjd) mjd + MJD_EPOCH_IN_CJD end
# File date/delta.rb, line 295
def modulo(n) dx_conv1(:modulo, n) end
Get the month of this date.
January is month 1.
# File date.rb, line 1192
def mon() civil[1] end
# File date.rb, line 1318
def new_offset(of=0)
if String === of
of = Rational(zone_to_diff(of) || 0, 86400)
end
self.class.new!(@ajd, of, @sg)
end
Create a copy of this Date object using a new Day of Calendar Reform.
# File date.rb, line 1298
def new_start(sg=self.class::ITALY) self.class.new!(@ajd, @of, sg) end
Return a new Date one day after this one.
# File date.rb, line 1408
def next() next_day end
# File date.rb, line 1440
def next_year(n=1) self >> n * 12 end
# File date.rb, line 1441
def prev_year(n=1) self << n * 12 end
# File date/delta.rb, line 298
def quotient(n)
if @delta.imag != 0
raise ArgumentError, "quotient: #{self} has month"
end
case n
when Numeric
return self.class.new!(Complex((@delta.real / n).truncate))
else
l, r = n.coerce(self)
return l.__send__(m, r)
end
end
# File date/delta.rb, line 312
def quotrem(n) [quotient(n), remainder(n)] end
# File date/delta.rb, line 311
def remainder(n) dx_conv1(:remainder, n) end
# File date/format.rb, line 351
def rfc2822() strftime('%a, %-d %b %Y %T %z') end
Get the second of this date.
# File date.rb, line 1219
def sec() time[2] end
Get the fraction-of-a-second of this date.
# File date.rb, line 1222
def sec_fraction() time[3] end
When is the Day of Calendar Reform for this Date object?
# File date.rb, line 1295
def start() @sg end
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.
# File date.rb, line 1449
def step(limit, step=1) # :yield: date
if step.zero?
raise ArgumentError, "step can't be 0"
end
unless block_given?
return to_enum(:step, limit, step)
end
da = self
op = %(- <= >=)[step <=> 0]
while da.__send__(op, limit)
yield da
da += step
end
self
end
# File date/format.rb, line 215
def strftime(fmt='%F')
fmt.gsub(/%([-_0^#]+)?(\d+)?([EO]?(?::{1,3}z|.))/) do
f = {}
m = $&
s, w, c = $1, $2, $3
if s
s.scan(/./) do |k|
case k
when '-'; f[:p] = '-'
when '_'; f[:p] = "\s"
when '0'; f[:p] = '0'
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
# File date.rb, line 529
def time_to_day_fraction(h, min, s)
Rational(h * 3600 + min * 60 + s, 86400) # 4p
end
# File date.rb, line 1805
def to_datetime() DateTime.new!(jd_to_ajd(jd, 0, 0), @of, @sg) end
# File date/delta.rb, line 375
def to_i() dx_conv0(:to_i) end
Return the date as a human-readable string.
The format used is YYYY-MM-DD.
# File date.rb, line 1495
def to_s() format('%.4d-%02d-%02d', year, mon, mday) end
# File date.rb, line 1803
def to_time() Time.local(year, mon, mday) end
# File date/delta.rb, line 373
def truncate() dx_conv0(:truncate) end
Step forward one day at a time until we reach max (inclusive), yielding each date as we go.
# File date.rb, line 1469
def upto(max, &block) # :yield: date
step(max, +1, &block)
end
Get the week day of this date. Sunday is day-of-week 0; Saturday is day-of-week 6.
# File date.rb, line 1248
def wday() jd_to_wday(jd) end
Get the day-of-the-year of this date.
January 1 is day-of-the-year 1
# File date.rb, line 1187
def yday() ordinal[1] end