Spec-Zone.ru › Ruby 2.6

класс Date

Родитель:
Объект
Включённые модули:
Comparable

класс даты и времени - Tadayoshi Funaba 1998-2011

'date' предоставляет два класса: Date и DateTime.

Термины и определения

Некоторые термины и определения основаны на ISO 8601 и JIS X 0301.

Календарная Date

Календарная дата — это определённый день календарного года, определяемый его порядковым номером в календарном месяце в этом году.

В этих классах это так называемая «гражданская» дата.

Порядковая Date

Порядковая дата — это определённый день календарного года, определяемый его порядковым номером в году.

В этих классах это так называемая «порядковая» дата.

Недельная Date

Недельная дата — это дата, определяемая номером календарной недели и дня недели.

Календарная неделя — это семидневный период в календарном году, начинающийся в понедельник и определяемый своим порядковым номером в году; первая календарная неделя года — та, которая включает первый четверг этого года. В григорианском календаре это эквивалентно неделе, которая включает 4 января.

В этих классах это так называемая «коммерческая» дата.

Номер юлианского дня

Номер юлианского дня — это количество прошедших дней с полудня (Гринвичское среднее Time) 1 января 4713 г. до н. э. (в юлианском календаре).

В данном документе астрономический номер юлианского дня такой же, как и исходный номер юлианского дня. А хронологический номер юлианского дня — это вариант номера юлианского дня. Его дни начинаются в полночь по местному времени.

В этом документе, когда просто упоминается «номер юлианского дня», имеется в виду «хронологический номер юлианского дня», а не исходный.

В этих классах они называются «ajd» и «jd».

Изменённый номер юлианского дня

Изменённый номер юлианского дня — это количество прошедших дней с полуночи (Координированное универсальное Time) 17 ноября 1858 г. н. э. (в григорианском календаре).

В данном документе астрономический изменённый номер юлианского дня такой же, как и исходный изменённый номер юлианского дня. А хронологический изменённый номер юлианского дня — это вариант изменённого номера юлианского дня. Его дни начинаются в полночь по местному времени.

В этом документе, когда просто упоминается «изменённый номер юлианского дня», имеется в виду «хронологический изменённый номер юлианского дня», а не исходный.

В этих классах они называются «amjd» и «mjd».

Date

Подкласс Object, включающий модуль Comparable и позволяющий легко обрабатывать даты.

Объект Date создаётся с помощью Date::new, Date::jd, Date::ordinal, Date::commercial, Date::parse, Date::strptime, Date::today, Time#to_date и т. д.

require 'date'

Date.new(2001,2,3)
 #=> #<Date: 2001-02-03 ...>
Date.jd(2451944)
 #=> #<Date: 2001-02-03 ...>
Date.ordinal(2001,34)
 #=> #<Date: 2001-02-03 ...>
Date.commercial(2001,5,6)
 #=> #<Date: 2001-02-03 ...>
Date.parse('2001-02-03')
 #=> #<Date: 2001-02-03 ...>
Date.strptime('03-02-2001', '%d-%m-%Y')
 #=> #<Date: 2001-02-03 ...>
Time.new(2001,2,3).to_date
 #=> #<Date: 2001-02-03 ...>

Все объекты дат неизменяемы; поэтому их нельзя изменить.

Концепцию объекта даты можно представить как кортеж из количества дней, смещения и дня календарной реформы.

Количество дней обозначает абсолютную позицию временной размерности. Смещение — это относительная корректировка, которая определяет декодированное местное время с учётом количества дней. День календарной реформы обозначает начальный день нового стиля. Старый стиль Запада — юлианский календарь, который был принят Цезарем. Новый стиль — григорианский календарь, который является текущим гражданским календарём многих стран.

Количество дней фактически представляет собой астрономический номер юлианского дня. Смещение в этом классе обычно равно нулю и не может быть указано напрямую.

Объект Date можно создать с необязательным аргументом — днём календарной реформы в виде номера юлианского дня, который должен находиться в диапазоне от 2298874 до 2426355 или быть отрицательной/положительной бесконечностью. Значение по умолчанию — Date::ITALY (2299161 = 1582-10-15). См. также sample/cal.rb.

$ ruby sample/cal.rb -c it 10 1582
    October 1582
 S  M Tu  W Th  F  S
    1  2  3  4 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

$ ruby sample/cal.rb -c gb  9 1752
   September 1752
 S  M Tu  W Th  F  S
       1  2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Объект Date имеет различные методы. См. каждую ссылку.

d = Date.parse('3rd Feb 2001')
                             #=> #<Date: 2001-02-03 ...>
d.year                       #=> 2001
d.mon                        #=> 2
d.mday                       #=> 3
d.wday                       #=> 6
d += 1                       #=> #<Date: 2001-02-04 ...>
d.strftime('%a %d %b %Y')    #=> "Sun 04 Feb 2001"

Константы

ABBR_DAYNAMES

Массив строк сокращённых названий дней недели в English. Первый — «Sun».

ABBR_MONTHNAMES

Массив строк сокращённых названий месяцев в English. Первый элемент — nil.

DAYNAMES

Массив строк полных названий дней недели в English. Первый — «Sunday».

ENGLAND

Номер юлианского дня дня календарной реформы для Англии и её колоний.

GREGORIAN

Номер юлианского дня дня календарной реформы для пролептического григорианского календаря.

ITALY

Номер юлианского дня дня календарной реформы для Италии и некоторых католических стран.

JULIAN

Номер юлианского дня дня календарной реформы для пролептического юлианского календаря.

MONTHNAMES

Массив строк полных названий месяцев в English. Первый элемент — nil.

Методы публичного класса

_httpdate(string) → hash Показать исходный код
static VALUE
date_s__httpdate(VALUE klass, VALUE str)
{
    return date__httpdate(str);
}

Возвращает хеш разобранных элементов.

_iso8601(string) → hash Показать исходный код
static VALUE
date_s__iso8601(VALUE klass, VALUE str)
{
    return date__iso8601(str);
}

Возвращает хеш разобранных элементов.

_jisx0301(string) → hash Показать исходный код
static VALUE
date_s__jisx0301(VALUE klass, VALUE str)
{
    return date__jisx0301(str);
}

Возвращает хеш разобранных элементов.

_parse(string[, comp=true]) → hash Показать исходный код
static VALUE
date_s__parse(int argc, VALUE *argv, VALUE klass)
{
    return date_s__parse_internal(argc, argv, klass);
}

Разбирает заданное представление даты и времени и возвращает хеш разобранных элементов. Этот метод не выполняет валидацию.

Если необязательный второй аргумент равен true, и обнаруженный год находится в диапазоне от “00” до “99”, год рассматривается как 2-значное представление и дополняется до 4-значного.

Date._parse('2001-02-03') #=> {:year=>2001, :mon=>2, :mday=>3}
_rfc2822(string) → hash Показать исходный код
static VALUE
date_s__rfc2822(VALUE klass, VALUE str)
{
    return date__rfc2822(str);
}

Возвращает хеш разобранных элементов.

_rfc3339(string) → hash Показать исходный код
static VALUE
date_s__rfc3339(VALUE klass, VALUE str)
{
    return date__rfc3339(str);
}

Возвращает хеш разобранных элементов.

_rfc822(string) → hash Показать исходный код
static VALUE
date_s__rfc2822(VALUE klass, VALUE str)
{
    return date__rfc2822(str);
}

Возвращает хеш разобранных элементов.

_strptime(string[, format='%F']) → hash Показать исходный код
static VALUE
date_s__strptime(int argc, VALUE *argv, VALUE klass)
{
    return date_s__strptime_internal(argc, argv, klass, "%F");
}

Разбирает заданное представление даты и времени по заданному шаблону и возвращает хеш разобранных элементов. _strptime не поддерживает указание флагов и ширины в отличие от strftime.

Date._strptime('2001-02-03', '%Y-%m-%d')
                          #=> {:year=>2001, :mon=>2, :mday=>3}

См. также strptime(3) и strftime.

_xmlschema(string) → hash Показать исходный код
static VALUE
date_s__xmlschema(VALUE klass, VALUE str)
{
    return date__xmlschema(str);
}

Возвращает хеш разобранных элементов.

civil([year=-4712[, month=1[, mday=1[, start=Date::ITALY]]]]) → date Показать исходный код
new([year=-4712[, month=1[, mday=1[, start=Date::ITALY]]]]) → date
static VALUE
date_s_civil(int argc, VALUE *argv, VALUE klass)
{
    return date_initialize(argc, argv, d_lite_s_alloc_simple(klass));
}

Создаёт объект даты, обозначающий заданную календарную дату.

В этом классе годы до н.э. считаются астрономически. Таким образом, год, предшествующий году 1, — это год ноль, а год, предшествующий году ноль, — год -1. Месяц и день месяца должны быть отрицательным или положительным числом (как относительный месяц/день от конца года/месяца при отрицательном значении). Они не должны быть равны нулю.

Последний аргумент должен быть номером юлианского дня, обозначающим день календарной реформы. Date::ITALY (2299161=1582-10-15), Date::ENGLAND (2361222=1752-09-14), Date::GREGORIAN (пролептический григорианский календарь) и Date::JULIAN (пролептический юлианский календарь) могут быть указаны как день календарной реформы.

Date.new(2001)            #=> #<Date: 2001-01-01 ...>
Date.new(2001,2,3)        #=> #<Date: 2001-02-03 ...>
Date.new(2001,2,-1)       #=> #<Date: 2001-02-28 ...>

См. также ::jd.

commercial([cwyear=-4712[, cweek=1[, cwday=1[, start=Date::ITALY]]]]) → date Показать исходный код
static VALUE
date_s_commercial(int argc, VALUE *argv, VALUE klass)
{
    VALUE vy, vw, vd, vsg, y, fr, fr2, ret;
    int w, d;
    double sg;

    rb_scan_args(argc, argv, "04", &vy, &vw, &vd, &vsg);

    y = INT2FIX(-4712);
    w = 1;
    d = 1;
    fr2 = INT2FIX(0);
    sg = DEFAULT_SG;

    switch (argc) {
      case 4:
        val2sg(vsg, sg);
      case 3:
        num2int_with_frac(d, positive_inf);
      case 2:
        w = NUM2INT(vw);
      case 1:
        y = vy;
    }

    {
        VALUE nth;
        int ry, rw, rd, rjd, ns;

        if (!valid_commercial_p(y, w, d, sg,
                                &nth, &ry,
                                &rw, &rd, &rjd,
                                &ns))
            rb_raise(rb_eArgError, "invalid date");

        ret = d_simple_new_internal(klass,
                                    nth, rjd,
                                    sg,
                                    0, 0, 0,
                                    HAVE_JD);
    }
    add_frac();
    return ret;
}

Создаёт объект даты, обозначающий заданную дату недели.

Номер недели и день недели должны быть отрицательными или положительными числами (как относительная неделя/день от конца года/недели при отрицательном значении). Они не должны быть равны нулю.

Date.commercial(2001)     #=> #<Date: 2001-01-01 ...>
Date.commercial(2002)     #=> #<Date: 2001-12-31 ...>
Date.commercial(2001,5,6) #=> #<Date: 2001-02-03 ...>

См. также ::jd и ::new.

gregorian_leap?(year) → bool Показать исходный код
static VALUE
date_s_gregorian_leap_p(VALUE klass, VALUE y)
{
    VALUE nth;
    int ry;

    decode_year(y, -1, &nth, &ry);
    return f_boolcast(c_gregorian_leap_p(ry));
}

Возвращает true, если заданный год является високосным годом в пролептическом григорианском календаре.

Date.gregorian_leap?(1900)        #=> false
Date.gregorian_leap?(2000)        #=> true
httpdate(string='Mon, 01 Jan -4712 00:00:00 GMT'[, start=Date::ITALY]) → date Показать исходный код
static VALUE
date_s_httpdate(int argc, VALUE *argv, VALUE klass)
{
    VALUE str, sg;

    rb_scan_args(argc, argv, "02", &str, &sg);

    switch (argc) {
      case 0:
        str = rb_str_new2("Mon, 01 Jan -4712 00:00:00 GMT");
      case 1:
        sg = INT2FIX(DEFAULT_SG);
    }

    {
        VALUE hash = date_s__httpdate(klass, str);
        return d_new_by_frags(klass, hash, sg);
    }
}

Создаёт новый объект Date, разобрав строку в соответствии с форматом RFC 2616.

Date.httpdate('Sat, 03 Feb 2001 00:00:00 GMT')
                                          #=> #<Date: 2001-02-03 ...>
iso8601(string='-4712-01-01'[, start=Date::ITALY]) → date Показать исходный код
static VALUE
date_s_iso8601(int argc, VALUE *argv, VALUE klass)
{
    VALUE str, sg;

    rb_scan_args(argc, argv, "02", &str, &sg);

    switch (argc) {
      case 0:
        str = rb_str_new2("-4712-01-01");
      case 1:
        sg = INT2FIX(DEFAULT_SG);
    }

    {
        VALUE hash = date_s__iso8601(klass, str);
        return d_new_by_frags(klass, hash, sg);
    }
}

Создаёт новый объект Date, разобрав строку в соответствии с общими форматами ISO 8601.

Date.iso8601('2001-02-03')        #=> #<Date: 2001-02-03 ...>
Date.iso8601('20010203')          #=> #<Date: 2001-02-03 ...>
Date.iso8601('2001-W05-6')        #=> #<Date: 2001-02-03 ...>
jd([jd=0[, start=Date::ITALY]]) → date Показать исходный код
static VALUE
date_s_jd(int argc, VALUE *argv, VALUE klass)
{
    VALUE vjd, vsg, jd, fr, fr2, ret;
    double sg;

    rb_scan_args(argc, argv, "02", &vjd, &vsg);

    jd = INT2FIX(0);
    fr2 = INT2FIX(0);
    sg = DEFAULT_SG;

    switch (argc) {
      case 2:
        val2sg(vsg, sg);
      case 1:
        num2num_with_frac(jd, positive_inf);
    }

    {
        VALUE nth;
        int rjd;

        decode_jd(jd, &nth, &rjd);
        ret = d_simple_new_internal(klass,
                                    nth, rjd,
                                    sg,
                                    0, 0, 0,
                                    HAVE_JD);
    }
    add_frac();
    return ret;
}

Создаёт объект даты, обозначающий заданный хронологический номер юлианского дня.

Date.jd(2451944)          #=> #<Date: 2001-02-03 ...>
Date.jd(2451945)          #=> #<Date: 2001-02-04 ...>
Date.jd(0)                #=> #<Date: -4712-01-01 ...>

См. также ::new.

jisx0301(string='-4712-01-01'[, start=Date::ITALY]) → date Показать исходный код
static VALUE
date_s_jisx0301(int argc, VALUE *argv, VALUE klass)
{
    VALUE str, sg;

    rb_scan_args(argc, argv, "02", &str, &sg);

    switch (argc) {
      case 0:
        str = rb_str_new2("-4712-01-01");
      case 1:
        sg = INT2FIX(DEFAULT_SG);
    }

    {
        VALUE hash = date_s__jisx0301(klass, str);
        return d_new_by_frags(klass, hash, sg);
    }
}

Создаёт новый объект Date, разобрав строку в соответствии с общими форматами JIS X 0301.

Date.jisx0301('H13.02.03')                #=> #<Date: 2001-02-03 ...>

Для года без эры, используется старый формат, Heisei.

Date.jisx0301('13.02.03')                 #=> #<Date: 2001-02-03 ...>
json_create(object) Показать исходный код
# File ext/json/lib/json/add/date.rb, line 11
def self.json_create(object)
  civil(*object.values_at('y', 'm', 'd', 'sg'))
end

Десериализует строку JSON, преобразуя юлианский год y, месяц m, день d и день календарной реформы sg в объект Date.

julian_leap?(year) → bool Показать исходный код
static VALUE
date_s_julian_leap_p(VALUE klass, VALUE y)
{
    VALUE nth;
    int ry;

    decode_year(y, +1, &nth, &ry);
    return f_boolcast(c_julian_leap_p(ry));
}

Возвращает true, если заданный год является високосным в пролептическом юлианском календаре.

Date.julian_leap?(1900)           #=> true
Date.julian_leap?(1901)           #=> false
leap?(year) → bool Показать исходный код
static VALUE
date_s_gregorian_leap_p(VALUE klass, VALUE y)
{
    VALUE nth;
    int ry;

    decode_year(y, -1, &nth, &ry);
    return f_boolcast(c_gregorian_leap_p(ry));
}

Возвращает true, если заданный год является високосным в пролептическом григорианском календаре.

Date.gregorian_leap?(1900)        #=> false
Date.gregorian_leap?(2000)        #=> true
new(p1 = v1, p2 = v2, p3 = v3, p4 = v4) Показать исходный код
static VALUE
date_initialize(int argc, VALUE *argv, VALUE self)
{
    VALUE vy, vm, vd, vsg, y, fr, fr2, ret;
    int m, d;
    double sg;
    struct SimpleDateData *dat = rb_check_typeddata(self, &d_lite_type);

    if (!simple_dat_p(dat)) {
        rb_raise(rb_eTypeError, "Date expected");
    }

    rb_scan_args(argc, argv, "04", &vy, &vm, &vd, &vsg);

    y = INT2FIX(-4712);
    m = 1;
    d = 1;
    fr2 = INT2FIX(0);
    sg = DEFAULT_SG;

    switch (argc) {
      case 4:
        val2sg(vsg, sg);
      case 3:
        num2int_with_frac(d, positive_inf);
      case 2:
        m = NUM2INT(vm);
      case 1:
        y = vy;
    }

    if (guess_style(y, sg) < 0) {
        VALUE nth;
        int ry, rm, rd;

        if (!valid_gregorian_p(y, m, d,
                               &nth, &ry,
                               &rm, &rd))
            rb_raise(rb_eArgError, "invalid date");

        set_to_simple(self, dat, nth, 0, sg, ry, rm, rd, HAVE_CIVIL);
    }
    else {
        VALUE nth;
        int ry, rm, rd, rjd, ns;

        if (!valid_civil_p(y, m, d, sg,
                           &nth, &ry,
                           &rm, &rd, &rjd,
                           &ns))
            rb_raise(rb_eArgError, "invalid date");

        set_to_simple(self, dat, nth, rjd, sg, ry, rm, rd, HAVE_JD | HAVE_CIVIL);
    }
    ret = self;
    add_frac();
    return ret;
}
new!(p1 = v1, p2 = v2, p3 = v3) Показать исходный код
static VALUE
date_s_new_bang(int argc, VALUE *argv, VALUE klass)
{
    VALUE ajd, of, sg, nth, sf;
    int jd, df, rof;
    double rsg;

    rb_scan_args(argc, argv, "03", &ajd, &of, &sg);

    switch (argc) {
      case 0:
        ajd = INT2FIX(0);
      case 1:
        of = INT2FIX(0);
      case 2:
        sg = INT2FIX(DEFAULT_SG);
    }

    old_to_new(ajd, of, sg,
               &nth, &jd, &df, &sf, &rof, &rsg);

    if (!df && f_zero_p(sf) && !rof)
        return d_simple_new_internal(klass,
                                     nth, jd,
                                     rsg,
                                     0, 0, 0,
                                     HAVE_JD);
    else
        return d_complex_new_internal(klass,
                                      nth, jd,
                                      df, sf,
                                      rof, rsg,
                                      0, 0, 0,
                                      0, 0, 0,
                                      HAVE_JD | HAVE_DF);
}
nth_kday(p1 = v1, p2 = v2, p3 = v3, p4 = v4, p5 = v5) Показать исходный код
static VALUE
date_s_nth_kday(int argc, VALUE *argv, VALUE klass)
{
    VALUE vy, vm, vn, vk, vsg, y, fr, fr2, ret;
    int m, n, k;
    double sg;

    rb_scan_args(argc, argv, "05", &vy, &vm, &vn, &vk, &vsg);

    y = INT2FIX(-4712);
    m = 1;
    n = 1;
    k = 1;
    fr2 = INT2FIX(0);
    sg = DEFAULT_SG;

    switch (argc) {
      case 5:
        val2sg(vsg, sg);
      case 4:
        num2int_with_frac(k, positive_inf);
      case 3:
        n = NUM2INT(vn);
      case 2:
        m = NUM2INT(vm);
      case 1:
        y = vy;
    }

    {
        VALUE nth;
        int ry, rm, rn, rk, rjd, ns;

        if (!valid_nth_kday_p(y, m, n, k, sg,
                              &nth, &ry,
                              &rm, &rn, &rk, &rjd,
                              &ns))
            rb_raise(rb_eArgError, "invalid date");

        ret = d_simple_new_internal(klass,
                                    nth, rjd,
                                    sg,
                                    0, 0, 0,
                                    HAVE_JD);
    }
    add_frac();
    return ret;
}
ordinal([year=-4712[, yday=1[, start=Date::ITALY]]]) → date Показать исходный код
static VALUE
date_s_ordinal(int argc, VALUE *argv, VALUE klass)
{
    VALUE vy, vd, vsg, y, fr, fr2, ret;
    int d;
    double sg;

    rb_scan_args(argc, argv, "03", &vy, &vd, &vsg);

    y = INT2FIX(-4712);
    d = 1;
    fr2 = INT2FIX(0);
    sg = DEFAULT_SG;

    switch (argc) {
      case 3:
        val2sg(vsg, sg);
      case 2:
        num2int_with_frac(d, positive_inf);
      case 1:
        y = vy;
    }

    {
        VALUE nth;
        int ry, rd, rjd, ns;

        if (!valid_ordinal_p(y, d, sg,
                             &nth, &ry,
                             &rd, &rjd,
                             &ns))
            rb_raise(rb_eArgError, "invalid date");

        ret = d_simple_new_internal(klass,
                                     nth, rjd,
                                     sg,
                                     0, 0, 0,
                                     HAVE_JD);
    }
    add_frac();
    return ret;
}

Создаёт объект даты, обозначающий указанную порядковую дату.

День года должен быть положительным или отрицательным числом (как относительный день от конца года при отрицательном значении). Он не должен быть равен нулю.

Date.ordinal(2001)        #=> #<Date: 2001-01-01 ...>
Date.ordinal(2001,34)     #=> #<Date: 2001-02-03 ...>
Date.ordinal(2001,-1)     #=> #<Date: 2001-12-31 ...>

См. также ::jd и ::new.

parse(string='-4712-01-01'[, comp=true[, start=Date::ITALY]]) → date Показать исходный код
static VALUE
date_s_parse(int argc, VALUE *argv, VALUE klass)
{
    VALUE str, comp, sg;

    rb_scan_args(argc, argv, "03", &str, &comp, &sg);

    switch (argc) {
      case 0:
        str = rb_str_new2("-4712-01-01");
      case 1:
        comp = Qtrue;
      case 2:
        sg = INT2FIX(DEFAULT_SG);
    }

    {
        VALUE argv2[2], hash;

        argv2[0] = str;
        argv2[1] = comp;
        hash = date_s__parse(2, argv2, klass);
        return d_new_by_frags(klass, hash, sg);
    }
}

Парсит заданное представление даты и времени и создаёт объект даты. Этот метод не работает как валидатор.

Если необязательный второй аргумент равен true и обнаруженный год находится в диапазоне от “00” до “99”, рассматривает год как двузначное представление и делает его полным.

Date.parse('2001-02-03')          #=> #<Date: 2001-02-03 ...>
Date.parse('20010203')            #=> #<Date: 2001-02-03 ...>
Date.parse('3rd Feb 2001')        #=> #<Date: 2001-02-03 ...>
rfc2822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY]) → date Показать исходный код
static VALUE
date_s_rfc2822(int argc, VALUE *argv, VALUE klass)
{
    VALUE str, sg;

    rb_scan_args(argc, argv, "02", &str, &sg);

    switch (argc) {
      case 0:
        str = rb_str_new2("Mon, 1 Jan -4712 00:00:00 +0000");
      case 1:
        sg = INT2FIX(DEFAULT_SG);
    }

    {
        VALUE hash = date_s__rfc2822(klass, str);
        return d_new_by_frags(klass, hash, sg);
    }
}

Создаёт новый объект Date, анализируя строку в соответствии с типичными форматами RFC 2822.

Date.rfc2822('Sat, 3 Feb 2001 00:00:00 +0000')
                                          #=> #<Date: 2001-02-03 ...>
rfc3339(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY]) → date Показать исходный код
static VALUE
date_s_rfc3339(int argc, VALUE *argv, VALUE klass)
{
    VALUE str, sg;

    rb_scan_args(argc, argv, "02", &str, &sg);

    switch (argc) {
      case 0:
        str = rb_str_new2("-4712-01-01T00:00:00+00:00");
      case 1:
        sg = INT2FIX(DEFAULT_SG);
    }

    {
        VALUE hash = date_s__rfc3339(klass, str);
        return d_new_by_frags(klass, hash, sg);
    }
}

Создаёт новый объект Date, анализируя строку в соответствии с типичными форматами RFC 3339.

Date.rfc3339('2001-02-03T04:05:06+07:00') #=> #<Date: 2001-02-03 ...>
rfc822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY]) → date Показать исходный код
static VALUE
date_s_rfc2822(int argc, VALUE *argv, VALUE klass)
{
    VALUE str, sg;

    rb_scan_args(argc, argv, "02", &str, &sg);

    switch (argc) {
      case 0:
        str = rb_str_new2("Mon, 1 Jan -4712 00:00:00 +0000");
      case 1:
        sg = INT2FIX(DEFAULT_SG);
    }

    {
        VALUE hash = date_s__rfc2822(klass, str);
        return d_new_by_frags(klass, hash, sg);
    }
}

Создаёт новый объект Date, анализируя строку в соответствии с типичными форматами RFC 2822.

Date.rfc2822('Sat, 3 Feb 2001 00:00:00 +0000')
                                          #=> #<Date: 2001-02-03 ...>
strptime([string='-4712-01-01'[, format='%F'[, start=Date::ITALY]]]) → date Показать исходный код
static VALUE
date_s_strptime(int argc, VALUE *argv, VALUE klass)
{
    VALUE str, fmt, sg;

    rb_scan_args(argc, argv, "03", &str, &fmt, &sg);

    switch (argc) {
      case 0:
        str = rb_str_new2("-4712-01-01");
      case 1:
        fmt = rb_str_new2("%F");
      case 2:
        sg = INT2FIX(DEFAULT_SG);
    }

    {
        VALUE argv2[2], hash;

        argv2[0] = str;
        argv2[1] = fmt;
        hash = date_s__strptime(2, argv2, klass);
        return d_new_by_frags(klass, hash, sg);
    }
}

Парсит заданное представление даты и времени с заданным шаблоном и создаёт объект даты. strptime не поддерживает указание флагов и ширины в отличие от strftime.

Date.strptime('2001-02-03', '%Y-%m-%d')   #=> #<Date: 2001-02-03 ...>
Date.strptime('03-02-2001', '%d-%m-%Y')   #=> #<Date: 2001-02-03 ...>
Date.strptime('2001-034', '%Y-%j')        #=> #<Date: 2001-02-03 ...>
Date.strptime('2001-W05-6', '%G-W%V-%u')  #=> #<Date: 2001-02-03 ...>
Date.strptime('2001 04 6', '%Y %U %w')    #=> #<Date: 2001-02-03 ...>
Date.strptime('2001 05 6', '%Y %W %u')    #=> #<Date: 2001-02-03 ...>
Date.strptime('sat3feb01', '%a%d%b%y')    #=> #<Date: 2001-02-03 ...>

См. также strptime(3) и strftime.

Общедоступные методы экземпляров

d + other → date Показать исходный код
static VALUE
d_lite_plus(VALUE self, VALUE other)
{
    int try_rational = 1;
    get_d1(self);

  again:
    switch (TYPE(other)) {
      case T_FIXNUM:
        {
            VALUE nth;
            long t;
            int jd;

            nth = m_nth(dat);
            t = FIX2LONG(other);
            if (DIV(t, CM_PERIOD)) {
                nth = f_add(nth, INT2FIX(DIV(t, CM_PERIOD)));
                t = MOD(t, CM_PERIOD);
            }

            if (!t)
                jd = m_jd(dat);
            else {
                jd = m_jd(dat) + (int)t;
                canonicalize_jd(nth, jd);
            }

            if (simple_dat_p(dat))
                return d_simple_new_internal(rb_obj_class(self),
                                             nth, jd,
                                             dat->s.sg,
                                             0, 0, 0,
                                             (dat->s.flags | HAVE_JD) &
                                             ~HAVE_CIVIL);
            else
                return d_complex_new_internal(rb_obj_class(self),
                                              nth, jd,
                                              dat->c.df, dat->c.sf,
                                              dat->c.of, dat->c.sg,
                                              0, 0, 0,
#ifndef USE_PACK
                                              dat->c.hour,
                                              dat->c.min,
                                              dat->c.sec,
#else
                                              EX_HOUR(dat->c.pc),
                                              EX_MIN(dat->c.pc),
                                              EX_SEC(dat->c.pc),
#endif
                                              (dat->c.flags | HAVE_JD) &
                                              ~HAVE_CIVIL);
        }
        break;
      case T_BIGNUM:
        {
            VALUE nth;
            int jd, s;

            if (f_positive_p(other))
                s = +1;
            else {
                s = -1;
                other = f_negate(other);
            }

            nth = f_idiv(other, INT2FIX(CM_PERIOD));
            jd = FIX2INT(f_mod(other, INT2FIX(CM_PERIOD)));

            if (s < 0) {
                nth = f_negate(nth);
                jd = -jd;
            }

            if (!jd)
                jd = m_jd(dat);
            else {
                jd = m_jd(dat) + jd;
                canonicalize_jd(nth, jd);
            }

            if (f_zero_p(nth))
                nth = m_nth(dat);
            else
                nth = f_add(m_nth(dat), nth);

            if (simple_dat_p(dat))
                return d_simple_new_internal(rb_obj_class(self),
                                             nth, jd,
                                             dat->s.sg,
                                             0, 0, 0,
                                             (dat->s.flags | HAVE_JD) &
                                             ~HAVE_CIVIL);
            else
                return d_complex_new_internal(rb_obj_class(self),
                                              nth, jd,
                                              dat->c.df, dat->c.sf,
                                              dat->c.of, dat->c.sg,
                                              0, 0, 0,
#ifndef USE_PACK
                                              dat->c.hour,
                                              dat->c.min,
                                              dat->c.sec,
#else
                                              EX_HOUR(dat->c.pc),
                                              EX_MIN(dat->c.pc),
                                              EX_SEC(dat->c.pc),
#endif
                                              (dat->c.flags | HAVE_JD) &
                                              ~HAVE_CIVIL);
        }
        break;
      case T_FLOAT:
        {
            double jd, o, tmp;
            int s, df;
            VALUE nth, sf;

            o = RFLOAT_VALUE(other);

            if (o > 0)
                s = +1;
            else {
                s = -1;
                o = -o;
            }

            o = modf(o, &tmp);

            if (!floor(tmp / CM_PERIOD)) {
                nth = INT2FIX(0);
                jd = (int)tmp;
            }
            else {
                double i, f;

                f = modf(tmp / CM_PERIOD, &i);
                nth = f_floor(DBL2NUM(i));
                jd = (int)(f * CM_PERIOD);
            }

            o *= DAY_IN_SECONDS;
            o = modf(o, &tmp);
            df = (int)tmp;
            o *= SECOND_IN_NANOSECONDS;
            sf = INT2FIX((int)round(o));

            if (s < 0) {
                jd = -jd;
                df = -df;
                sf = f_negate(sf);
            }

            if (f_zero_p(sf))
                sf = m_sf(dat);
            else {
                sf = f_add(m_sf(dat), sf);
                if (f_lt_p(sf, INT2FIX(0))) {
                    df -= 1;
                    sf = f_add(sf, INT2FIX(SECOND_IN_NANOSECONDS));
                }
                else if (f_ge_p(sf, INT2FIX(SECOND_IN_NANOSECONDS))) {
                    df += 1;
                    sf = f_sub(sf, INT2FIX(SECOND_IN_NANOSECONDS));
                }
            }

            if (!df)
                df = m_df(dat);
            else {
                df = m_df(dat) + df;
                if (df < 0) {
                    jd -= 1;
                    df += DAY_IN_SECONDS;
                }
                else if (df >= DAY_IN_SECONDS) {
                    jd += 1;
                    df -= DAY_IN_SECONDS;
                }
            }

            if (!jd)
                jd = m_jd(dat);
            else {
                jd = m_jd(dat) + jd;
                canonicalize_jd(nth, jd);
            }

            if (f_zero_p(nth))
                nth = m_nth(dat);
            else
                nth = f_add(m_nth(dat), nth);

            if (!df && f_zero_p(sf) && !m_of(dat))
                return d_simple_new_internal(rb_obj_class(self),
                                             nth, (int)jd,
                                             m_sg(dat),
                                             0, 0, 0,
                                             (dat->s.flags | HAVE_JD) &
                                             ~(HAVE_CIVIL | HAVE_TIME |
                                               COMPLEX_DAT));
            else
                return d_complex_new_internal(rb_obj_class(self),
                                              nth, (int)jd,
                                              df, sf,
                                              m_of(dat), m_sg(dat),
                                              0, 0, 0,
                                              0, 0, 0,
                                              (dat->c.flags |
                                               HAVE_JD | HAVE_DF) &
                                              ~(HAVE_CIVIL | HAVE_TIME));
        }
        break;
      default:
        expect_numeric(other);
        other = f_to_r(other);
        if (!k_rational_p(other)) {
            if (!try_rational) Check_Type(other, T_RATIONAL);
            try_rational = 0;
            goto again;
        }
        /* fall through */
      case T_RATIONAL:
        {
            VALUE nth, sf, t;
            int jd, df, s;

            if (wholenum_p(other)) {
                other = rb_rational_num(other);
                goto again;
            }

            if (f_positive_p(other))
                s = +1;
            else {
                s = -1;
                other = f_negate(other);
            }

            nth = f_idiv(other, INT2FIX(CM_PERIOD));
            t = f_mod(other, INT2FIX(CM_PERIOD));

            jd = FIX2INT(f_idiv(t, INT2FIX(1)));
            t = f_mod(t, INT2FIX(1));

            t = f_mul(t, INT2FIX(DAY_IN_SECONDS));
            df = FIX2INT(f_idiv(t, INT2FIX(1)));
            t = f_mod(t, INT2FIX(1));

            sf = f_mul(t, INT2FIX(SECOND_IN_NANOSECONDS));

            if (s < 0) {
                nth = f_negate(nth);
                jd = -jd;
                df = -df;
                sf = f_negate(sf);
            }

            if (f_zero_p(sf))
                sf = m_sf(dat);
            else {
                sf = f_add(m_sf(dat), sf);
                if (f_lt_p(sf, INT2FIX(0))) {
                    df -= 1;
                    sf = f_add(sf, INT2FIX(SECOND_IN_NANOSECONDS));
                }
                else if (f_ge_p(sf, INT2FIX(SECOND_IN_NANOSECONDS))) {
                    df += 1;
                    sf = f_sub(sf, INT2FIX(SECOND_IN_NANOSECONDS));
                }
            }

            if (!df)
                df = m_df(dat);
            else {
                df = m_df(dat) + df;
                if (df < 0) {
                    jd -= 1;
                    df += DAY_IN_SECONDS;
                }
                else if (df >= DAY_IN_SECONDS) {
                    jd += 1;
                    df -= DAY_IN_SECONDS;
                }
            }

            if (!jd)
                jd = m_jd(dat);
            else {
                jd = m_jd(dat) + jd;
                canonicalize_jd(nth, jd);
            }

            if (f_zero_p(nth))
                nth = m_nth(dat);
            else
                nth = f_add(m_nth(dat), nth);

            if (!df && f_zero_p(sf) && !m_of(dat))
                return d_simple_new_internal(rb_obj_class(self),
                                             nth, jd,
                                             m_sg(dat),
                                             0, 0, 0,
                                             (dat->s.flags | HAVE_JD) &
                                             ~(HAVE_CIVIL | HAVE_TIME |
                                               COMPLEX_DAT));
            else
                return d_complex_new_internal(rb_obj_class(self),
                                              nth, jd,
                                              df, sf,
                                              m_of(dat), m_sg(dat),
                                              0, 0, 0,
                                              0, 0, 0,
                                              (dat->c.flags |
                                               HAVE_JD | HAVE_DF) &
                                              ~(HAVE_CIVIL | HAVE_TIME));
        }
        break;
    }
}

Возвращает объект даты, указывающий на other день после текущей. Значение other должно быть числовым. Если other — дробное число, предполагается, что его точность не более наносекунд.

Date.new(2001,2,3) + 1    #=> #<Date: 2001-02-04 ...>
DateTime.new(2001,2,3) + Rational(1,2)
                          #=> #<DateTime: 2001-02-03T12:00:00+00:00 ...>
DateTime.new(2001,2,3) + Rational(-1,2)
                          #=> #<DateTime: 2001-02-02T12:00:00+00:00 ...>
DateTime.jd(0,12) + DateTime.new(2001,2,3).ajd
                          #=> #<DateTime: 2001-02-03T00:00:00+00:00 ...>
d - other → date или рациональное число Показать исходный код
static VALUE
d_lite_minus(VALUE self, VALUE other)
{
    if (k_date_p(other))
        return minus_dd(self, other);

    switch (TYPE(other)) {
      case T_FIXNUM:
        return d_lite_plus(self, LONG2NUM(-FIX2LONG(other)));
      case T_FLOAT:
        return d_lite_plus(self, DBL2NUM(-RFLOAT_VALUE(other)));
      default:
        expect_numeric(other);
        /* fall through */
      case T_BIGNUM:
      case T_RATIONAL:
        return d_lite_plus(self, f_negate(other));
    }
}

Возвращает разницу между двумя датами, если other — объект даты. Если other — числовое значение, возвращает объект даты, указывающий на other день до текущей. Если other — дробное число, предполагается, что его точность не более наносекунд.

Date.new(2001,2,3) - 1   #=> #<Date: 2001-02-02 ...>
DateTime.new(2001,2,3) - Rational(1,2)
                         #=> #<DateTime: 2001-02-02T12:00:00+00:00 ...>
Date.new(2001,2,3) - Date.new(2001)
                         #=> (33/1)
DateTime.new(2001,2,3) - DateTime.new(2001,2,2,12)
                         #=> (1/2)
d << n → date Показать исходный код
static VALUE
d_lite_lshift(VALUE self, VALUE other)
{
    expect_numeric(other);
    return d_lite_rshift(self, f_negate(other));
}

Возвращает объект даты, указывающий на n месяц до текущей. Аргумент n должен быть числовым.

Date.new(2001,2,3)  <<  1   #=> #<Date: 2001-01-03 ...>
Date.new(2001,2,3)  << -2   #=> #<Date: 2001-04-03 ...>

Если для соответствующего месяца нет такого же дня, используется последний день месяца:

Date.new(2001,3,28) << 1   #=> #<Date: 2001-02-28 ...>
Date.new(2001,3,31) << 1   #=> #<Date: 2001-02-28 ...>

Это также приводит к следующему, возможно, неожиданному поведению:

Date.new(2001,3,31) << 2         #=> #<Date: 2001-01-31 ...>
Date.new(2001,3,31) << 1 << 1    #=> #<Date: 2001-01-28 ...>

Date.new(2001,3,31) << 1 << -1   #=> #<Date: 2001-03-28 ...>
d <=> other → -1, 0, +1 или nil Показать исходный код
static VALUE
d_lite_cmp(VALUE self, VALUE other)
{
    if (!k_date_p(other))
        return cmp_gen(self, other);

    {
        get_d2(self, other);

        if (!(simple_dat_p(adat) && simple_dat_p(bdat) &&
              m_gregorian_p(adat) == m_gregorian_p(bdat)))
            return cmp_dd(self, other);

        {
            VALUE a_nth, b_nth;
            int a_jd, b_jd;

            m_canonicalize_jd(self, adat);
            m_canonicalize_jd(other, bdat);
            a_nth = m_nth(adat);
            b_nth = m_nth(bdat);
            if (f_eqeq_p(a_nth, b_nth)) {
                a_jd = m_jd(adat);
                b_jd = m_jd(bdat);
                if (a_jd == b_jd) {
                    return INT2FIX(0);
                }
                else if (a_jd < b_jd) {
                    return INT2FIX(-1);
                }
                else {
                    return INT2FIX(1);
                }
            }
            else if (f_lt_p(a_nth, b_nth)) {
                return INT2FIX(-1);
            }
            else {
                return INT2FIX(1);
            }
        }
    }
}

Сравнивает две даты и возвращает -1, ноль, 1 или nil. Other должен быть объектом даты или числовым значением в виде астрономического юлианского дня.

Date.new(2001,2,3) <=> Date.new(2001,2,4)   #=> -1
Date.new(2001,2,3) <=> Date.new(2001,2,3)   #=> 0
Date.new(2001,2,3) <=> Date.new(2001,2,2)   #=> 1
Date.new(2001,2,3) <=> Object.new           #=> nil
Date.new(2001,2,3) <=> Rational(4903887,2)  #=> 0

См. также Comparable.

d === other → bool Показать исходный код
static VALUE
d_lite_equal(VALUE self, VALUE other)
{
    if (!k_date_p(other))
        return equal_gen(self, other);

    {
        get_d2(self, other);

        if (!(m_gregorian_p(adat) == m_gregorian_p(bdat)))
            return equal_gen(self, other);

        {
            VALUE a_nth, b_nth;
            int a_jd, b_jd;

            m_canonicalize_jd(self, adat);
            m_canonicalize_jd(other, bdat);
            a_nth = m_nth(adat);
            b_nth = m_nth(bdat);
            a_jd = m_local_jd(adat);
            b_jd = m_local_jd(bdat);
            if (f_eqeq_p(a_nth, b_nth) &&
                a_jd == b_jd)
                return Qtrue;
            return Qfalse;
        }
    }
}

Возвращает true, если это один и тот же день.

Date.new(2001,2,3) === Date.new(2001,2,3)
                                  #=> true
Date.new(2001,2,3) === Date.new(2001,2,4)
                                  #=> false
DateTime.new(2001,2,3) === DateTime.new(2001,2,3,12)
                                  #=> true
DateTime.new(2001,2,3) === DateTime.new(2001,2,3,0,0,0,'+24:00')
                                  #=> true
DateTime.new(2001,2,3) === DateTime.new(2001,2,4,0,0,0,'+24:00')
                                  #=> false
d >> n → date Показать исходный код
static VALUE
d_lite_rshift(VALUE self, VALUE other)
{
    VALUE t, y, nth, rjd2;
    int m, d, rjd;
    double sg;

    get_d1(self);
    t = f_add3(f_mul(m_real_year(dat), INT2FIX(12)),
               INT2FIX(m_mon(dat) - 1),
               other);
    if (FIXNUM_P(t)) {
        long it = FIX2LONG(t);
        y = LONG2NUM(DIV(it, 12));
        it = MOD(it, 12);
        m = (int)it + 1;
    }
    else {
        y = f_idiv(t, INT2FIX(12));
        t = f_mod(t, INT2FIX(12));
        m = FIX2INT(t) + 1;
    }
    d = m_mday(dat);
    sg = m_sg(dat);

    while (1) {
        int ry, rm, rd, ns;

        if (valid_civil_p(y, m, d, sg,
                          &nth, &ry,
                          &rm, &rd, &rjd, &ns))
            break;
        if (--d < 1)
            rb_raise(rb_eArgError, "invalid date");
    }
    encode_jd(nth, rjd, &rjd2);
    return d_lite_plus(self, f_sub(rjd2, m_real_local_jd(dat)));
}

Возвращает объект даты, указывающий на n месяц после текущей. Аргумент n должен быть числовым.

Date.new(2001,2,3)  >>  1   #=> #<Date: 2001-03-03 ...>
Date.new(2001,2,3)  >> -2   #=> #<Date: 2000-12-03 ...>

Если для соответствующего месяца нет такого же дня, используется последний день месяца:

Date.new(2001,1,28) >> 1   #=> #<Date: 2001-02-28 ...>
Date.new(2001,1,31) >> 1   #=> #<Date: 2001-02-28 ...>

Это также приводит к следующему, возможно, неожиданному поведению:

Date.new(2001,1,31) >> 2         #=> #<Date: 2001-03-31 ...>
Date.new(2001,1,31) >> 1 >> 1    #=> #<Date: 2001-03-28 ...>

Date.new(2001,1,31) >> 1 >> -1   #=> #<Date: 2001-01-28 ...>
ajd → rational Показать исходный код
static VALUE
d_lite_ajd(VALUE self)
{
    get_d1(self);
    return m_ajd(dat);
}

Возвращает астрономическое юлианское число дня. Это дробное число, которое не скорректировано смещением.

DateTime.new(2001,2,3,4,5,6,'+7').ajd     #=> (11769328217/4800)
DateTime.new(2001,2,2,14,5,6,'-7').ajd    #=> (11769328217/4800)
amjd → rational Показать исходный код
static VALUE
d_lite_amjd(VALUE self)
{
    get_d1(self);
    return m_amjd(dat);
}

Возвращает астрономическое модифицированное юлианское число дня. Это дробное число, которое не скорректировано смещением.

DateTime.new(2001,2,3,4,5,6,'+7').amjd    #=> (249325817/4800)
DateTime.new(2001,2,2,14,5,6,'-7').amjd   #=> (249325817/4800)
as_json(*) Показать исходный код
# File ext/json/lib/json/add/date.rb, line 19
def as_json(*)
  {
    JSON.create_id => self.class.name,
    'y' => year,
    'm' => month,
    'd' => day,
    'sg' => start,
  }
end

Возвращает хэш, который будет преобразован в объект JSON и представляет этот объект.

asctime → строка Показать исходный код
static VALUE
d_lite_asctime(VALUE self)
{
    return strftimev("%a %b %e %H:%M:%S %Y", self, set_tmx);
}

Возвращает строку в формате asctime(3) (но без «n0» в конце). Этот метод эквивалентен strftime('%c').

См. также asctime(3) или ctime(3).

ctime → строка Показать исходный код
static VALUE
d_lite_asctime(VALUE self)
{
    return strftimev("%a %b %e %H:%M:%S %Y", self, set_tmx);
}

Возвращает строку в формате asctime(3) (но без «n0» в конце). Этот метод эквивалентен strftime('%c').

См. также asctime(3) или ctime(3).

cwday → целое число Показать исходный код
static VALUE
d_lite_cwday(VALUE self)
{
    get_d1(self);
    return INT2FIX(m_cwday(dat));
}

Возвращает день недели (1-7, понедельник — 1).

Date.new(2001,2,3).cwday          #=> 6
cweek → целое число Показать исходный код
static VALUE
d_lite_cweek(VALUE self)
{
    get_d1(self);
    return INT2FIX(m_cweek(dat));
}

Возвращает номер недели (1-53).

Date.new(2001,2,3).cweek          #=> 5
cwyear → целое число Показать исходный код
static VALUE
d_lite_cwyear(VALUE self)
{
    get_d1(self);
    return m_real_cwyear(dat);
}

Возвращает год, основанный на номере недели.

Date.new(2001,2,3).cwyear         #=> 2001
Date.new(2000,1,1).cwyear         #=> 1999
day → целое число Показать исходный код
static VALUE
d_lite_mday(VALUE self)
{
    get_d1(self);
    return INT2FIX(m_mday(dat));
}

Возвращает день месяца (1-31).

Date.new(2001,2,3).mday           #=> 3
day_fraction → рациональное число Показать исходный код
static VALUE
d_lite_day_fraction(VALUE self)
{
    get_d1(self);
    if (simple_dat_p(dat))
        return INT2FIX(0);
    return m_fr(dat);
}

Возвращает дробную часть дня.

DateTime.new(2001,2,3,12).day_fraction    #=> (1/2)
downto(min) → перечислитель Показать исходный код
downto(min){|date| ...} → self
static VALUE
d_lite_downto(VALUE self, VALUE min)
{
    VALUE date;

    RETURN_ENUMERATOR(self, 1, &min);

    date = self;
    while (FIX2INT(d_lite_cmp(date, min)) >= 0) {
        rb_yield(date);
        date = d_lite_plus(date, INT2FIX(-1));
    }
    return self;
}

Этот метод эквивалентен step(min, -1){|date| …}.

england → date Показать исходный код
static VALUE
d_lite_england(VALUE self)
{
    return dup_obj_with_new_start(self, ENGLAND);
}

Этот метод эквивалентен new_start(Date::ENGLAND).

fill() Показать исходный код
static VALUE
d_lite_fill(VALUE self)
{
    get_d1(self);

    if (simple_dat_p(dat)) {
        get_s_jd(dat);
        get_s_civil(dat);
    }
    else {
        get_c_jd(dat);
        get_c_civil(dat);
        get_c_df(dat);
        get_c_time(dat);
    }
    return self;
}
friday? → bool Показать исходный код
static VALUE
d_lite_friday_p(VALUE self)
{
    get_d1(self);
    return f_boolcast(m_wday(dat) == 5);
}

Возвращает true, если дата — пятница.

gregorian → date Показать исходный код
static VALUE
d_lite_gregorian(VALUE self)
{
    return dup_obj_with_new_start(self, GREGORIAN);
}

Этот метод эквивалентен new_start(Date::GREGORIAN).

gregorian? → bool Показать исходный код
static VALUE
d_lite_gregorian_p(VALUE self)
{
    get_d1(self);
    return f_boolcast(m_gregorian_p(dat));
}

Возвращает true, если дата равна или после дня календарной реформы.

Date.new(1582,10,15).gregorian?          #=> true
(Date.new(1582,10,15) - 1).gregorian?    #=> false
httpdate → строка Показать исходный код
static VALUE
d_lite_httpdate(VALUE self)
{
    volatile VALUE dup = dup_obj_with_new_offset(self, 0);
    return strftimev("%a, %d %b %Y %T GMT", dup, set_tmx);
}

Этот метод эквивалентен strftime('%a, %d %b %Y %T GMT'). См. также RFC 2616.

inspect → строка Показать исходный код
static VALUE
d_lite_inspect(VALUE self)
{
    get_d1(self);
    return mk_inspect(dat, rb_obj_class(self), self);
}

Возвращает значение в виде строки для проверки.

Date.new(2001,2,3).inspect
          #=> "#<Date: 2001-02-03 ((2451944j,0s,0n),+0s,2299161j)>"
DateTime.new(2001,2,3,4,5,6,'-7').inspect
          #=> "#<DateTime: 2001-02-03T04:05:06-07:00 ((2451944j,39906s,0n),-25200s,2299161j)>"
inspect_raw() Показать исходный код
static VALUE
d_lite_inspect_raw(VALUE self)
{
    get_d1(self);
    return mk_inspect_raw(dat, rb_obj_class(self));
}
END_OF_DOCUMENT_MARKER
iso8601 → string Показать исходный код
xmlschema → string
static VALUE
d_lite_iso8601(VALUE self)
{
    return strftimev("%Y-%m-%d", self, set_tmx);
}

Этот метод эквивалентен strftime('%F').

italy → date Показать исходный код
static VALUE
d_lite_italy(VALUE self)
{
    return dup_obj_with_new_start(self, ITALY);
}

Этот метод эквивалентен new_start(Date::ITALY).

jd → integer Показать исходный код
static VALUE
d_lite_jd(VALUE self)
{
    get_d1(self);
    return m_real_local_jd(dat);
}

Возвращает номер юлианского дня. Это целое число, скорректированное с учётом смещения по местному времени.

DateTime.new(2001,2,3,4,5,6,'+7').jd      #=> 2451944
DateTime.new(2001,2,3,4,5,6,'-7').jd      #=> 2451944
jisx0301 → string Показать исходный код
static VALUE
d_lite_jisx0301(VALUE self)
{
    char fmtbuf[JISX0301_DATE_SIZE];
    const char *fmt;

    get_d1(self);
    fmt = jisx0301_date_format(fmtbuf, sizeof(fmtbuf),
                               m_real_local_jd(dat),
                               m_real_year(dat));
    return strftimev(fmt, self, set_tmx);
}

Возвращает строку в формате JIS X 0301.

Date.new(2001,2,3).jisx0301       #=> "H13.02.03"
julian → date Показать исходный код
static VALUE
d_lite_julian(VALUE self)
{
    return dup_obj_with_new_start(self, JULIAN);
}

Этот метод эквивалентен new_start(Date::JULIAN).

julian? → bool Показать исходный код
static VALUE
d_lite_julian_p(VALUE self)
{
    get_d1(self);
    return f_boolcast(m_julian_p(dat));
}

Возвращает true, если дата до реформы календаря.

Date.new(1582,10,15).julian?             #=> false
(Date.new(1582,10,15) - 1).julian?       #=> true
ld → integer Показать исходный код
static VALUE
d_lite_ld(VALUE self)
{
    get_d1(self);
    return f_sub(m_real_local_jd(dat), INT2FIX(2299160));
}

Возвращает номер дня Лилиана. Это целое число, скорректированное с учётом смещения по местному времени.

Date.new(2001,2,3).ld            #=> 152784
leap? → bool Показать исходный код
static VALUE
d_lite_leap_p(VALUE self)
{
    int rjd, ns, ry, rm, rd;

    get_d1(self);
    if (m_gregorian_p(dat))
        return f_boolcast(c_gregorian_leap_p(m_year(dat)));

    c_civil_to_jd(m_year(dat), 3, 1, m_virtual_sg(dat),
                  &rjd, &ns);
    c_jd_to_civil(rjd - 1, m_virtual_sg(dat), &ry, &rm, &rd);
    return f_boolcast(rd == 29);
}

Возвращает true, если год високосный.

Date.new(2000).leap?      #=> true
Date.new(2001).leap?      #=> false
marshal_dump_old() Показать исходный код
static VALUE
d_lite_marshal_dump_old(VALUE self)
{
    VALUE a;

    get_d1(self);

    a = rb_ary_new3(3,
                    m_ajd(dat),
                    m_of_in_day(dat),
                    DBL2NUM(m_sg(dat)));

    if (FL_TEST(self, FL_EXIVAR)) {
        rb_copy_generic_ivar(a, self);
        FL_SET(a, FL_EXIVAR);
    }

    return a;
}
mday → fixnum Показать исходный код
static VALUE
d_lite_mday(VALUE self)
{
    get_d1(self);
    return INT2FIX(m_mday(dat));
}

Возвращает день месяца (1-31).

Date.new(2001,2,3).mday           #=> 3
mjd → integer Показать исходный код
static VALUE
d_lite_mjd(VALUE self)
{
    get_d1(self);
    return f_sub(m_real_local_jd(dat), INT2FIX(2400001));
}

Возвращает номер изменённого юлианского дня. Это целое число, скорректированное с учётом смещения по местному времени.

DateTime.new(2001,2,3,4,5,6,'+7').mjd     #=> 51943
DateTime.new(2001,2,3,4,5,6,'-7').mjd     #=> 51943
mon → fixnum Показать исходный код
month → fixnum
static VALUE
d_lite_mon(VALUE self)
{
    get_d1(self);
    return INT2FIX(m_mon(dat));
}

Возвращает месяц (1-12).

Date.new(2001,2,3).mon            #=> 2
monday? → bool Показать исходный код
static VALUE
d_lite_monday_p(VALUE self)
{
    get_d1(self);
    return f_boolcast(m_wday(dat) == 1);
}

Возвращает true, если дата — понедельник.

month → fixnum Показать исходный код
static VALUE
d_lite_mon(VALUE self)
{
    get_d1(self);
    return INT2FIX(m_mon(dat));
}

Возвращает месяц (1-12).

Date.new(2001,2,3).mon            #=> 2
new_start([start=Date::ITALY]) → date Показать исходный код
static VALUE
d_lite_new_start(int argc, VALUE *argv, VALUE self)
{
    VALUE vsg;
    double sg;

    rb_scan_args(argc, argv, "01", &vsg);

    sg = DEFAULT_SG;
    if (argc >= 1)
        val2sg(vsg, sg);

    return dup_obj_with_new_start(self, sg);
}

Создаёт дубликат и сбрасывает день реформы календаря.

d = Date.new(1582,10,15)
d.new_start(Date::JULIAN)         #=> #<Date: 1582-10-05 ...>
END_OF_DOCUMENT_MARKER
step(limit[, step=1]) → перечислитель Показать исходный код
step(limit[, step=1]){|дата| ...} → self
static VALUE
d_lite_step(int argc, VALUE *argv, VALUE self)
{
    VALUE limit, step, date;
    int c;

    rb_scan_args(argc, argv, "11", &limit, &step);

    if (argc < 2)
        step = INT2FIX(1);

#if 0
    if (f_zero_p(step))
        rb_raise(rb_eArgError, "step can't be 0");
#endif

    RETURN_ENUMERATOR(self, argc, argv);

    date = self;
    c = f_cmp(step, INT2FIX(0));
    if (c < 0) {
        while (FIX2INT(d_lite_cmp(date, limit)) >= 0) {
            rb_yield(date);
            date = d_lite_plus(date, step);
        }
    }
    else if (c == 0) {
        while (1)
            rb_yield(date);
    }
    else /* if (c > 0) */ {
        while (FIX2INT(d_lite_cmp(date, limit)) <= 0) {
            rb_yield(date);
            date = d_lite_plus(date, step);
        }
    }
    return self;
}

Итерационно выполняет оценку заданного блока, принимающего объект даты. Параметр limit должен быть объектом даты.

Date.new(2001).step(Date.new(2001,-1,-1)).select{|d| d.sunday?}.size
                          #=> 52
strftime([формат='%F']) → строка Показать исходный код
static VALUE
d_lite_strftime(int argc, VALUE *argv, VALUE self)
{
    return date_strftime_internal(argc, argv, self,
                                  "%Y-%m-%d", set_tmx);
}

Форматирует дату в соответствии с указаниями в строке формата. Указатели начинаются с символа процента (%). Любой текст, не являющийся указателем, будет передан в строку вывода.

Указатель состоит из символа процента (%), нуля или более флагов, необязательной минимальной ширины поля, необязательного модификатора и спецификатора преобразования следующим образом.

%<flags><width><modifier><conversion>

Флаги:

-  don't pad a numerical output.
_  use spaces for padding.
0  use zeros for padding.
^  upcase the result string.
#  change case.

Минимальная ширина поля определяет минимальную ширину.

Модификаторы — “E”, “O”, “:”, “::” и “:::”. “E” и “O” игнорируются. В настоящее время на результат это не влияет.

Указатели формата:

Date (Year, Month, Day):
  %Y - Year with century (can be negative, 4 digits at least)
          -0001, 0000, 1995, 2009, 14292, etc.
  %C - year / 100 (round down.  20 in 2009)
  %y - year % 100 (00..99)

  %m - Month of the year, zero-padded (01..12)
          %_m  blank-padded ( 1..12)
          %-m  no-padded (1..12)
  %B - The full month name (``January'')
          %^B  uppercased (``JANUARY'')
  %b - The abbreviated month name (``Jan'')
          %^b  uppercased (``JAN'')
  %h - Equivalent to %b

  %d - Day of the month, zero-padded (01..31)
          %-d  no-padded (1..31)
  %e - Day of the month, blank-padded ( 1..31)

  %j - Day of the year (001..366)

Time (Hour, Minute, Second, Subsecond):
  %H - Hour of the day, 24-hour clock, zero-padded (00..23)
  %k - Hour of the day, 24-hour clock, blank-padded ( 0..23)
  %I - Hour of the day, 12-hour clock, zero-padded (01..12)
  %l - Hour of the day, 12-hour clock, blank-padded ( 1..12)
  %P - Meridian indicator, lowercase (``am'' or ``pm'')
  %p - Meridian indicator, uppercase (``AM'' or ``PM'')

  %M - Minute of the hour (00..59)

  %S - Second of the minute (00..60)

  %L - Millisecond of the second (000..999)
  %N - Fractional seconds digits, default is 9 digits (nanosecond)
          %3N  millisecond (3 digits)   %15N femtosecond (15 digits)
          %6N  microsecond (6 digits)   %18N attosecond  (18 digits)
          %9N  nanosecond  (9 digits)   %21N zeptosecond (21 digits)
          %12N picosecond (12 digits)   %24N yoctosecond (24 digits)

Time zone:
  %z - Time zone as hour and minute offset from UTC (e.g. +0900)
          %:z - hour and minute offset from UTC with a colon (e.g. +09:00)
          %::z - hour, minute and second offset from UTC (e.g. +09:00:00)
          %:::z - hour, minute and second offset from UTC
                                            (e.g. +09, +09:30, +09:30:30)
  %Z - Equivalent to %:z (e.g. +09:00)

Weekday:
  %A - The full weekday name (``Sunday'')
          %^A  uppercased (``SUNDAY'')
  %a - The abbreviated name (``Sun'')
          %^a  uppercased (``SUN'')
  %u - Day of the week (Monday is 1, 1..7)
  %w - Day of the week (Sunday is 0, 0..6)

ISO 8601 week-based year and week number:
The week 1 of YYYY starts with a Monday and includes YYYY-01-04.
The days in the year before the first week are in the last week of
the previous year.
  %G - The week-based year
  %g - The last 2 digits of the week-based year (00..99)
  %V - Week number of the week-based year (01..53)

Week number:
The week 1 of YYYY starts with a Sunday or Monday (according to %U
or %W).  The days in the year before the first week are in week 0.
  %U - Week number of the year.  The week starts with Sunday.  (00..53)
  %W - Week number of the year.  The week starts with Monday.  (00..53)

Seconds since the Unix Epoch:
  %s - Number of seconds since 1970-01-01 00:00:00 UTC.
  %Q - Number of milliseconds since 1970-01-01 00:00:00 UTC.

Literal string:
  %n - Newline character (\n)
  %t - Tab character (\t)
  %% - Literal ``%'' character

Combination:
  %c - date and time (%a %b %e %T %Y)
  %D - Date (%m/%d/%y)
  %F - The ISO 8601 date format (%Y-%m-%d)
  %v - VMS date (%e-%b-%Y)
  %x - Same as %D
  %X - Same as %T
  %r - 12-hour time (%I:%M:%S %p)
  %R - 24-hour time (%H:%M)
  %T - 24-hour time (%H:%M:%S)
  %+ - date(1) (%a %b %e %H:%M:%S %Z %Y)

Этот метод аналогичен функции strftime(), определенной в ISO C и POSIX. Несколько указателей (%a, %A, %b, %B, %c, %p, %r, %x, %X, %E*, %O* и %Z) зависят от локали в функции. Однако этот метод независим от локали. Поэтому результат может отличаться, даже если используется одна и та же строка формата в других системах, таких как C. Рекомендуется избегать %x и %X, так как существуют соответствующие независимые от локали представления %D и %T.

Примеры:

d = DateTime.new(2007,11,19,8,37,48,"-06:00")
                          #=> #<DateTime: 2007-11-19T08:37:48-0600 ...>
d.strftime("Printed on %m/%d/%Y")   #=> "Printed on 11/19/2007"
d.strftime("at %I:%M%p")            #=> "at 08:37AM"

Различные форматы ISO 8601:

%Y%m%d           => 20071119                  Calendar date (basic)
%F               => 2007-11-19                Calendar date (extended)
%Y-%m            => 2007-11                   Calendar date, reduced accuracy, specific month
%Y               => 2007                      Calendar date, reduced accuracy, specific year
%C               => 20                        Calendar date, reduced accuracy, specific century
%Y%j             => 2007323                   Ordinal date (basic)
%Y-%j            => 2007-323                  Ordinal date (extended)
%GW%V%u          => 2007W471                  Week date (basic)
%G-W%V-%u        => 2007-W47-1                Week date (extended)
%GW%V            => 2007W47                   Week date, reduced accuracy, specific week (basic)
%G-W%V           => 2007-W47                  Week date, reduced accuracy, specific week (extended)
%H%M%S           => 083748                    Local time (basic)
%T               => 08:37:48                  Local time (extended)
%H%M             => 0837                      Local time, reduced accuracy, specific minute (basic)
%H:%M            => 08:37                     Local time, reduced accuracy, specific minute (extended)
%H               => 08                        Local time, reduced accuracy, specific hour
%H%M%S,%L        => 083748,000                Local time with decimal fraction, comma as decimal sign (basic)
%T,%L            => 08:37:48,000              Local time with decimal fraction, comma as decimal sign (extended)
%H%M%S.%L        => 083748.000                Local time with decimal fraction, full stop as decimal sign (basic)
%T.%L            => 08:37:48.000              Local time with decimal fraction, full stop as decimal sign (extended)
%H%M%S%z         => 083748-0600               Local time and the difference from UTC (basic)
%T%:z            => 08:37:48-06:00            Local time and the difference from UTC (extended)
%Y%m%dT%H%M%S%z  => 20071119T083748-0600      Date and time of day for calendar date (basic)
%FT%T%:z         => 2007-11-19T08:37:48-06:00 Date and time of day for calendar date (extended)
%Y%jT%H%M%S%z    => 2007323T083748-0600       Date and time of day for ordinal date (basic)
%Y-%jT%T%:z      => 2007-323T08:37:48-06:00   Date and time of day for ordinal date (extended)
%GW%V%uT%H%M%S%z => 2007W471T083748-0600      Date and time of day for week date (basic)
%G-W%V-%uT%T%:z  => 2007-W47-1T08:37:48-06:00 Date and time of day for week date (extended)
%Y%m%dT%H%M      => 20071119T0837             Calendar date and local time (basic)
%FT%R            => 2007-11-19T08:37          Calendar date and local time (extended)
%Y%jT%H%MZ       => 2007323T0837Z             Ordinal date and UTC of day (basic)
%Y-%jT%RZ        => 2007-323T08:37Z           Ordinal date and UTC of day (extended)
%GW%V%uT%H%M%z   => 2007W471T0837-0600        Week date and local time and difference from UTC (basic)
%G-W%V-%uT%R%:z  => 2007-W47-1T08:37-06:00    Week date and local time and difference from UTC (extended)

См. также strftime(3) и ::strptime.

succ → дата Показать исходный код
static VALUE
d_lite_next(VALUE self)
{
    return d_lite_next_day(0, (VALUE *)NULL, self);
}

Возвращает объект даты, обозначающий следующий день.

sunday? → bool Показать исходный код
static VALUE
d_lite_sunday_p(VALUE self)
{
    get_d1(self);
    return f_boolcast(m_wday(dat) == 0);
}

Возвращает true, если дата — воскресенье.

thursday? → bool Показать исходный код
static VALUE
d_lite_thursday_p(VALUE self)
{
    get_d1(self);
    return f_boolcast(m_wday(dat) == 4);
}

Возвращает true, если дата — четверг.

to_date → self Показать исходный код
static VALUE
date_to_date(VALUE self)
{
    return self;
}

Возвращает self.

to_datetime → datetime Показать исходный код
static VALUE
date_to_datetime(VALUE self)
{
    get_d1a(self);

    if (simple_dat_p(adat)) {
        VALUE new = d_lite_s_alloc_simple(cDateTime);
        {
            get_d1b(new);
            bdat->s = adat->s;
            return new;
        }
    }
    else {
        VALUE new = d_lite_s_alloc_complex(cDateTime);
        {
            get_d1b(new);
            bdat->c = adat->c;
            bdat->c.df = 0;
            RB_OBJ_WRITE(new, &bdat->c.sf, INT2FIX(0));
#ifndef USE_PACK
            bdat->c.hour = 0;
            bdat->c.min = 0;
            bdat->c.sec = 0;
#else
            bdat->c.pc = PACK5(EX_MON(adat->c.pc), EX_MDAY(adat->c.pc),
                               0, 0, 0);
            bdat->c.flags |= HAVE_DF | HAVE_TIME;
#endif
            return new;
        }
    }
}

Возвращает объект DateTime, обозначающий self.

to_json(*args) Показать исходный код
# File ext/json/lib/json/add/date.rb, line 31
def to_json(*args)
  as_json.to_json(*args)
end

Сохраняет имя класса (Date) с юлианским годом y, месяцем m, днем d и днем календарной реформы sg как строку JSON

to_s → строка Показать исходный код
static VALUE
d_lite_to_s(VALUE self)
{
    return strftimev("%Y-%m-%d", self, set_tmx);
}

Возвращает строку в формате ISO 8601. (Этот метод не использует расширенные представления.)

Date.new(2001,2,3).to_s  #=> "2001-02-03"
to_time → время Показать исходный код
static VALUE
date_to_time(VALUE self)
{
    get_d1(self);

    return f_local3(rb_cTime,
                    m_real_year(dat),
                    INT2FIX(m_mon(dat)),
                    INT2FIX(m_mday(dat)));
}

Возвращает объект Time, обозначающий self.

tuesday? → bool Показать исходный код
static VALUE
d_lite_tuesday_p(VALUE self)
{
    get_d1(self);
    return f_boolcast(m_wday(dat) == 2);
}

Возвращает true, если дата — вторник.

upto(макс) → перечислитель Показать исходный код
upto(макс){|дата| ...} → self
static VALUE
d_lite_upto(VALUE self, VALUE max)
{
    VALUE date;

    RETURN_ENUMERATOR(self, 1, &max);

    date = self;
    while (FIX2INT(d_lite_cmp(date, max)) <= 0) {
        rb_yield(date);
        date = d_lite_plus(date, INT2FIX(1));
    }
    return self;
}

Этот метод эквивалентен step(max, 1){|date| …}.

wday → целое Показать исходный код
static VALUE
d_lite_wday(VALUE self)
{
    get_d1(self);
    return INT2FIX(m_wday(dat));
}

Возвращает день недели (0-6, воскресенье — 0).

Date.new(2001,2,3).wday           #=> 6
wednesday? → bool Показать исходный код
static VALUE
d_lite_wednesday_p(VALUE self)
{
    get_d1(self);
    return f_boolcast(m_wday(dat) == 3);
}

Возвращает true, если дата — среда.

iso8601 → строка Показать исходный код
xmlschema → строка
static VALUE
d_lite_iso8601(VALUE self)
{
    return strftimev("%Y-%m-%d", self, set_tmx);
}

Этот метод эквивалентен strftime('%F').

yday → целое Показать исходный код
static VALUE
d_lite_yday(VALUE self)
{
    get_d1(self);
    return INT2FIX(m_yday(dat));
}

Возвращает день года (1-366).

Date.new(2001,2,3).yday           #=> 34
year → целое Показать исходный код
static VALUE
d_lite_year(VALUE self)
{
    get_d1(self);
    return m_real_year(dat);
}

Возвращает год.

Date.new(2001,2,3).year           #=> 2001
(Date.new(1,1,1) - 1).year        #=> 0

Приватные методы экземпляра

hour() Показать исходный код
static VALUE
d_lite_zero(VALUE x)
{
    return INT2FIX(0);
}
min() Показать исходный код
static VALUE
d_lite_zero(VALUE x)
{
    return INT2FIX(0);
}
minute() Показать исходный код
static VALUE
d_lite_zero(VALUE x)
{
    return INT2FIX(0);
}
sec() Показать исходный код
static VALUE
d_lite_zero(VALUE x)
{
    return INT2FIX(0);
}
second() Показать исходный код
static VALUE
d_lite_zero(VALUE x)
{
    return INT2FIX(0);
}
wnum0() Показать исходный код
static VALUE
d_lite_wnum0(VALUE self)
{
    get_d1(self);
    return INT2FIX(m_wnum0(dat));
}
wnum1() Показать исходный код
static VALUE
d_lite_wnum1(VALUE self)
{
    get_d1(self);
    return INT2FIX(m_wnum1(dat));
}

Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API