class DateTime
DateTime
Eine Unterklasse von Date, die Datum, Stunde, Minute, Sekunde und Offset einfach handhabt.
DateTime Klasse wird als veraltet betrachtet. Verwenden Sie die Time Klasse.
DateTime berücksichtigt keine Schaltsekunden und verfolgt keine Sommerzeitregeln.
Ein DateTime Objekt wird erstellt mit DateTime::new, DateTime::jd, DateTime::ordinal, DateTime::commercial, DateTime::parse, DateTime::strptime, DateTime::now, Time#to_datetime, etc.
require 'date' DateTime.new(2001,2,3,4,5,6) #=> #<DateTime: 2001-02-03T04:05:06+00:00 ...>
Das letzte Element von Tag, Stunde, Minute oder Sekunde kann eine Bruchzahl sein. Die Präzision der Bruchzahl wird höchstens auf Nanosekunden angenommen.
DateTime.new(2001,2,3.5) #=> #<DateTime: 2001-02-03T12:00:00+00:00 ...>
Ein optionales Argument, der Offset, gibt die Differenz zwischen der lokalen Zeit und UTC an. Zum Beispiel repräsentiert Rational(3,24) 3 Stunden vor UTC, Rational(-5,24) repräsentiert 5 Stunden hinter UTC. Der Offset sollte zwischen -1 und +1 liegen, und seine Präzision wird höchstens auf Sekunden angenommen. Der Standardwert ist Null (entspricht UTC).
DateTime.new(2001,2,3,4,5,6,Rational(3,24)) #=> #<DateTime: 2001-02-03T04:05:06+03:00 ...>
Der Offset akzeptiert auch String-Formate
DateTime.new(2001,2,3,4,5,6,'+03:00') #=> #<DateTime: 2001-02-03T04:05:06+03:00 ...>
Ein optionales Argument, der Tag der Kalenderreform (start), bezeichnet eine Julianische Tageszahl, die zwischen 2298874 und 2426355 oder negativ/positiv unendlich liegen sollte. Der Standardwert ist Date::ITALY (2299161=1582-10-15).
Ein DateTime Objekt hat verschiedene Methoden. Siehe die jeweilige Referenz.
d = DateTime.parse('3rd Feb 2001 04:05:06+03:30') #=> #<DateTime: 2001-02-03T04:05:06+03:30 ...> d.hour #=> 4 d.min #=> 5 d.sec #=> 6 d.offset #=> (7/48) d.zone #=> "+03:30" d += Rational('1.5') #=> #<DateTime: 2001-02-04%16:05:06+03:30 ...> d = d.new_offset('+09:00') #=> #<DateTime: 2001-02-04%21:35:06+09:00 ...> d.strftime('%I:%M:%S %p') #=> "09:35:06 PM" d > DateTime.new(1999) #=> true
Wann sollte man DateTime verwenden und wann Time?
Es ist ein weit verbreiteter Irrtum, dass William Shakespeare und Miguel de Cervantes am selben Tag starben - so sehr, dass die UNESCO den 23. April zum Welttag des Buches erklärt hat. Da England jedoch den Gregorianischen Kalender noch nicht übernommen hatte (und dies erst 1752 tun sollte), liegen ihre Todesdaten tatsächlich 10 Tage auseinander. Da die Ruby Time Klasse einen proleptischen Gregorianischen Kalender implementiert und kein Konzept von Kalenderreformen hat, gibt es keine Möglichkeit, dies mit Time Objekten auszudrücken. Hier kommt DateTime ins Spiel.
shakespeare = DateTime.iso8601('1616-04-23', Date::ENGLAND) #=> Tue, 23 Apr 1616 00:00:00 +0000 cervantes = DateTime.iso8601('1616-04-23', Date::ITALY) #=> Sat, 23 Apr 1616 00:00:00 +0000
Man sieht schon, dass etwas seltsam ist - die Wochentage sind unterschiedlich. Gehen wir weiter
cervantes == shakespeare #=> false (shakespeare - cervantes).to_i #=> 10
Dies zeigt, dass sie tatsächlich 10 Tage auseinander starben (in Wirklichkeit 11 Tage, da Cervantes einen Tag früher starb, aber am 23. beigesetzt wurde). Das tatsächliche Todesdatum von Shakespeare können wir sehen, indem wir die Methode gregorian verwenden, um es zu konvertieren.
shakespeare.gregorian #=> Tue, 03 May 1616 00:00:00 +0000
Es gibt also das Argument, dass all die Feierlichkeiten, die am 23. April in Stratford-upon-Avon stattfinden, eigentlich das falsche Datum sind, da England jetzt den Gregorianischen Kalender verwendet. Man kann sehen, warum, wenn wir über die Grenze des Reformdatums wechseln.
# start off with the anniversary of Shakespeare's birth in 1751 shakespeare = DateTime.iso8601('1751-04-23', Date::ENGLAND) #=> Tue, 23 Apr 1751 00:00:00 +0000 # add 366 days since 1752 is a leap year and April 23 is after February 29 shakespeare + 366 #=> Thu, 23 Apr 1752 00:00:00 +0000 # add another 365 days to take us to the anniversary in 1753 shakespeare + 366 + 365 #=> Fri, 04 May 1753 00:00:00 +0000
Wie Sie sehen können, wenn wir die Anzahl der Sonnenjahre seit Shakespeares Geburtstag genau verfolgen, wäre das korrekte Jubiläumsdatum der 4. Mai und nicht der 23. April.
Wann sollten Sie also DateTime in Ruby verwenden und wann Time? Mit ziemlicher Sicherheit werden Sie Time verwenden wollen, da Ihre Anwendung wahrscheinlich mit aktuellen Daten und Zeiten umgeht. Wenn Sie jedoch mit Daten und Zeiten in einem historischen Kontext umgehen müssen, werden Sie DateTime verwenden wollen, um die gleichen Fehler wie die UNESCO zu vermeiden. Wenn Sie sich auch mit Zeitzonen befassen müssen, dann viel Glück - bedenken Sie nur, dass Sie wahrscheinlich mit lokalen Sonnenzeiten umgehen werden, da erst im 19. Jahrhundert mit der Einführung der Eisenbahnen die Notwendigkeit für Standardzeit und schließlich Zeitzonen entstand.
Öffentliche Klassenmethoden
Source
static VALUE
datetime_s__strptime(int argc, VALUE *argv, VALUE klass)
{
return date_s__strptime_internal(argc, argv, klass, "%FT%T%z");
}
Parst die gegebene Darstellung von Datum und Uhrzeit mit der gegebenen Vorlage und gibt einen Hash der geparsten Elemente zurück. _strptime unterstützt nicht die Angabe von Flags und Breiten im Gegensatz zu strftime.
Siehe auch strptime(3) und strftime.
Source
static VALUE
datetime_s_civil(int argc, VALUE *argv, VALUE klass)
{
return datetime_initialize(argc, argv, d_lite_s_alloc_complex(klass));
}
Dasselbe wie DateTime.new.
Source
static VALUE
datetime_s_commercial(int argc, VALUE *argv, VALUE klass)
{
VALUE vy, vw, vd, vh, vmin, vs, vof, vsg, y, fr, fr2, ret;
int w, d, h, min, s, rof;
double sg;
rb_scan_args(argc, argv, "08", &vy, &vw, &vd, &vh, &vmin, &vs, &vof, &vsg);
y = INT2FIX(-4712);
w = 1;
d = 1;
h = min = s = 0;
fr2 = INT2FIX(0);
rof = 0;
sg = DEFAULT_SG;
switch (argc) {
case 8:
val2sg(vsg, sg);
case 7:
val2off(vof, rof);
case 6:
check_numeric(vs, "second");
num2int_with_frac(s, positive_inf);
case 5:
check_numeric(vmin, "minute");
num2int_with_frac(min, 5);
case 4:
check_numeric(vh, "hour");
num2int_with_frac(h, 4);
case 3:
check_numeric(vd, "cwday");
num2int_with_frac(d, 3);
case 2:
check_numeric(vw, "cweek");
w = NUM2INT(vw);
case 1:
check_numeric(vy, "year");
y = vy;
}
{
VALUE nth;
int ry, rw, rd, rh, rmin, rs, rjd, rjd2, ns;
if (!valid_commercial_p(y, w, d, sg,
&nth, &ry,
&rw, &rd, &rjd,
&ns))
rb_raise(eDateError, "invalid date");
if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs))
rb_raise(eDateError, "invalid date");
canon24oc();
rjd2 = jd_local_to_utc(rjd,
time_to_df(rh, rmin, rs),
rof);
ret = d_complex_new_internal(klass,
nth, rjd2,
0, INT2FIX(0),
rof, sg,
0, 0, 0,
rh, rmin, rs,
HAVE_JD | HAVE_TIME);
}
add_frac();
return ret;
}
Erstellt ein DateTime Objekt, das das gegebene Wochen-Datum bezeichnet.
DateTime.commercial(2001) #=> #<DateTime: 2001-01-01T00:00:00+00:00 ...> DateTime.commercial(2002) #=> #<DateTime: 2001-12-31T00:00:00+00:00 ...> DateTime.commercial(2001,5,6,4,5,6,'+7') #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
Source
static VALUE
datetime_s_httpdate(int argc, VALUE *argv, VALUE klass)
{
VALUE str, sg, opt;
argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
switch (argc) {
case 0:
str = rb_str_new2(JULIAN_EPOCH_DATETIME_HTTPDATE);
case 1:
sg = INT2FIX(DEFAULT_SG);
}
{
int argc2 = 1;
VALUE argv2[2], hash;
argv2[0] = str;
argv2[1] = opt;
if (!NIL_P(opt)) argc2++;
hash = date_s__httpdate(argc2, argv2, klass);
return dt_new_by_frags(klass, hash, sg);
}
}
Erstellt ein neues DateTime Objekt durch Parsen eines Strings gemäß einem RFC 2616 Format.
DateTime.httpdate('Sat, 03 Feb 2001 04:05:06 GMT') #=> #<DateTime: 2001-02-03T04:05:06+00:00 ...>
Löst einen ArgumentError aus, wenn die Stringlänge größer als *limit* ist. Sie können diese Prüfung stoppen, indem Sie limit: nil übergeben, beachten Sie jedoch, dass das Parsen lange dauern kann.
Source
static VALUE
datetime_s_iso8601(int argc, VALUE *argv, VALUE klass)
{
VALUE str, sg, opt;
argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
switch (argc) {
case 0:
str = rb_str_new2(JULIAN_EPOCH_DATETIME);
case 1:
sg = INT2FIX(DEFAULT_SG);
}
{
int argc2 = 1;
VALUE argv2[2], hash;
argv2[0] = str;
argv2[1] = opt;
if (!NIL_P(opt)) argc2++;
hash = date_s__iso8601(argc2, argv2, klass);
return dt_new_by_frags(klass, hash, sg);
}
}
Erstellt ein neues DateTime Objekt durch Parsen eines Strings gemäß typischen ISO 8601 Formaten.
DateTime.iso8601('2001-02-03T04:05:06+07:00') #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...> DateTime.iso8601('20010203T040506+0700') #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...> DateTime.iso8601('2001-W05-6T04:05:06+07:00') #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
Löst einen ArgumentError aus, wenn die Stringlänge größer als *limit* ist. Sie können diese Prüfung stoppen, indem Sie limit: nil übergeben, beachten Sie jedoch, dass das Parsen lange dauern kann.
Source
static VALUE
datetime_s_jd(int argc, VALUE *argv, VALUE klass)
{
VALUE vjd, vh, vmin, vs, vof, vsg, jd, fr, fr2, ret;
int h, min, s, rof;
double sg;
rb_scan_args(argc, argv, "06", &vjd, &vh, &vmin, &vs, &vof, &vsg);
jd = INT2FIX(0);
h = min = s = 0;
fr2 = INT2FIX(0);
rof = 0;
sg = DEFAULT_SG;
switch (argc) {
case 6:
val2sg(vsg, sg);
case 5:
val2off(vof, rof);
case 4:
check_numeric(vs, "second");
num2int_with_frac(s, positive_inf);
case 3:
check_numeric(vmin, "minute");
num2int_with_frac(min, 3);
case 2:
check_numeric(vh, "hour");
num2int_with_frac(h, 2);
case 1:
check_numeric(vjd, "jd");
num2num_with_frac(jd, 1);
}
{
VALUE nth;
int rh, rmin, rs, rjd, rjd2;
if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs))
rb_raise(eDateError, "invalid date");
canon24oc();
decode_jd(jd, &nth, &rjd);
rjd2 = jd_local_to_utc(rjd,
time_to_df(rh, rmin, rs),
rof);
ret = d_complex_new_internal(klass,
nth, rjd2,
0, INT2FIX(0),
rof, sg,
0, 0, 0,
rh, rmin, rs,
HAVE_JD | HAVE_TIME);
}
add_frac();
return ret;
}
Erstellt ein DateTime Objekt, das die gegebene chronologische Julianische Tageszahl bezeichnet.
DateTime.jd(2451944) #=> #<DateTime: 2001-02-03T00:00:00+00:00 ...> DateTime.jd(2451945) #=> #<DateTime: 2001-02-04T00:00:00+00:00 ...> DateTime.jd(Rational('0.5')) #=> #<DateTime: -4712-01-01T12:00:00+00:00 ...>
Source
static VALUE
datetime_s_jisx0301(int argc, VALUE *argv, VALUE klass)
{
VALUE str, sg, opt;
argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
switch (argc) {
case 0:
str = rb_str_new2(JULIAN_EPOCH_DATETIME);
case 1:
sg = INT2FIX(DEFAULT_SG);
}
{
int argc2 = 1;
VALUE argv2[2], hash;
argv2[0] = str;
argv2[1] = opt;
if (!NIL_P(opt)) argc2++;
hash = date_s__jisx0301(argc2, argv2, klass);
return dt_new_by_frags(klass, hash, sg);
}
}
Erstellt ein neues DateTime Objekt durch Parsen eines Strings gemäß typischen JIS X 0301 Formaten.
DateTime.jisx0301('H13.02.03T04:05:06+07:00') #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
Für Jahre ohne Ära wird das Legacy-Format Heisei angenommen.
DateTime.jisx0301('13.02.03T04:05:06+07:00') #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
Löst einen ArgumentError aus, wenn die Stringlänge größer als *limit* ist. Sie können diese Prüfung stoppen, indem Sie limit: nil übergeben, beachten Sie jedoch, dass das Parsen lange dauern kann.
Source
# File ext/json/lib/json/add/date_time.rb, line 10 def self.json_create(object) args = object.values_at('y', 'm', 'd', 'H', 'M', 'S') of_a, of_b = object['of'].split('/') if of_b and of_b != '0' args << Rational(of_a.to_i, of_b.to_i) else args << of_a end args << object['sg'] civil(*args) end
Siehe as_json.
Source
static VALUE
datetime_s_civil(int argc, VALUE *argv, VALUE klass)
{
return datetime_initialize(argc, argv, d_lite_s_alloc_complex(klass));
}
Dasselbe wie DateTime.new.
Source
static VALUE
datetime_s_now(int argc, VALUE *argv, VALUE klass)
{
VALUE vsg, nth, ret;
double sg;
#ifdef HAVE_CLOCK_GETTIME
struct timespec ts;
#else
struct timeval tv;
#endif
time_t sec;
struct tm tm;
long sf, of;
int y, ry, m, d, h, min, s;
rb_scan_args(argc, argv, "01", &vsg);
if (argc < 1)
sg = DEFAULT_SG;
else
sg = NUM2DBL(vsg);
#ifdef HAVE_CLOCK_GETTIME
if (clock_gettime(CLOCK_REALTIME, &ts) == -1)
rb_sys_fail("clock_gettime");
sec = ts.tv_sec;
#else
if (gettimeofday(&tv, NULL) == -1)
rb_sys_fail("gettimeofday");
sec = tv.tv_sec;
#endif
tzset();
if (!localtime_r(&sec, &tm))
rb_sys_fail("localtime");
y = tm.tm_year + 1900;
m = tm.tm_mon + 1;
d = tm.tm_mday;
h = tm.tm_hour;
min = tm.tm_min;
s = tm.tm_sec;
if (s == 60)
s = 59;
#ifdef HAVE_STRUCT_TM_TM_GMTOFF
of = tm.tm_gmtoff;
#elif defined(HAVE_TIMEZONE)
#if defined(HAVE_ALTZONE) && !defined(_AIX)
of = (long)-((tm.tm_isdst > 0) ? altzone : timezone);
#else
of = (long)-timezone;
if (tm.tm_isdst) {
time_t sec2;
tm.tm_isdst = 0;
sec2 = mktime(&tm);
of += (long)difftime(sec2, sec);
}
#endif
#elif defined(HAVE_TIMEGM)
{
time_t sec2;
sec2 = timegm(&tm);
of = (long)difftime(sec2, sec);
}
#else
{
struct tm tm2;
time_t sec2;
if (!gmtime_r(&sec, &tm2))
rb_sys_fail("gmtime");
tm2.tm_isdst = tm.tm_isdst;
sec2 = mktime(&tm2);
of = (long)difftime(sec, sec2);
}
#endif
#ifdef HAVE_CLOCK_GETTIME
sf = ts.tv_nsec;
#else
sf = tv.tv_usec * 1000;
#endif
if (of < -DAY_IN_SECONDS || of > DAY_IN_SECONDS) {
of = 0;
rb_warning("invalid offset is ignored");
}
decode_year(INT2FIX(y), -1, &nth, &ry);
ret = d_complex_new_internal(klass,
nth, 0,
0, LONG2NUM(sf),
(int)of, GREGORIAN,
ry, m, d,
h, min, s,
HAVE_CIVIL | HAVE_TIME);
{
get_d1(ret);
set_sg(dat, sg);
}
return ret;
}
Erstellt ein DateTime Objekt, das die aktuelle Zeit bezeichnet.
DateTime.now #=> #<DateTime: 2011-06-11T21:20:44+09:00 ...>
Source
static VALUE
datetime_s_ordinal(int argc, VALUE *argv, VALUE klass)
{
VALUE vy, vd, vh, vmin, vs, vof, vsg, y, fr, fr2, ret;
int d, h, min, s, rof;
double sg;
rb_scan_args(argc, argv, "07", &vy, &vd, &vh, &vmin, &vs, &vof, &vsg);
y = INT2FIX(-4712);
d = 1;
h = min = s = 0;
fr2 = INT2FIX(0);
rof = 0;
sg = DEFAULT_SG;
switch (argc) {
case 7:
val2sg(vsg, sg);
case 6:
val2off(vof, rof);
case 5:
check_numeric(vs, "second");
num2int_with_frac(s, positive_inf);
case 4:
check_numeric(vmin, "minute");
num2int_with_frac(min, 4);
case 3:
check_numeric(vh, "hour");
num2int_with_frac(h, 3);
case 2:
check_numeric(vd, "yday");
num2int_with_frac(d, 2);
case 1:
check_numeric(vy, "year");
y = vy;
}
{
VALUE nth;
int ry, rd, rh, rmin, rs, rjd, rjd2, ns;
if (!valid_ordinal_p(y, d, sg,
&nth, &ry,
&rd, &rjd,
&ns))
rb_raise(eDateError, "invalid date");
if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs))
rb_raise(eDateError, "invalid date");
canon24oc();
rjd2 = jd_local_to_utc(rjd,
time_to_df(rh, rmin, rs),
rof);
ret = d_complex_new_internal(klass,
nth, rjd2,
0, INT2FIX(0),
rof, sg,
0, 0, 0,
rh, rmin, rs,
HAVE_JD | HAVE_TIME);
}
add_frac();
return ret;
}
Erstellt ein DateTime Objekt, das das gegebene ordinale Datum bezeichnet.
DateTime.ordinal(2001,34) #=> #<DateTime: 2001-02-03T00:00:00+00:00 ...> DateTime.ordinal(2001,34,4,5,6,'+7') #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...> DateTime.ordinal(2001,-332,-20,-55,-54,'+7') #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
Source
static VALUE
datetime_s_parse(int argc, VALUE *argv, VALUE klass)
{
VALUE str, comp, sg, opt;
argc = rb_scan_args(argc, argv, "03:", &str, &comp, &sg, &opt);
switch (argc) {
case 0:
str = rb_str_new2(JULIAN_EPOCH_DATETIME);
case 1:
comp = Qtrue;
case 2:
sg = INT2FIX(DEFAULT_SG);
}
{
int argc2 = 2;
VALUE argv2[3], hash;
argv2[0] = str;
argv2[1] = comp;
argv2[2] = opt;
if (!NIL_P(opt)) argc2++;
hash = date_s__parse(argc2, argv2, klass);
return dt_new_by_frags(klass, hash, sg);
}
}
Parst die gegebene Darstellung von Datum und Uhrzeit und erstellt ein DateTime Objekt.
Diese Methode **ist keine** Validierung. Wenn der Eingabestring nicht strikt gültigen Formaten entspricht, erhalten Sie möglicherweise ein kryptisches Ergebnis. Sie sollten erwägen, stattdessen DateTime.strptime zu verwenden.
Wenn das optionale zweite Argument true ist und das erkannte Jahr im Bereich „00“ bis „99“ liegt, wird es in voller Länge dargestellt.
DateTime.parse('2001-02-03T04:05:06+07:00') #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...> DateTime.parse('20010203T040506+0700') #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...> DateTime.parse('3rd Feb 2001 04:05:06 PM') #=> #<DateTime: 2001-02-03T16:05:06+00:00 ...>
Löst einen ArgumentError aus, wenn die Stringlänge größer als *limit* ist. Sie können diese Prüfung stoppen, indem Sie limit: nil übergeben, beachten Sie jedoch, dass das Parsen lange dauern kann.
Source
static VALUE
datetime_s_rfc2822(int argc, VALUE *argv, VALUE klass)
{
VALUE str, sg, opt;
argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
switch (argc) {
case 0:
str = rb_str_new2(JULIAN_EPOCH_DATETIME_RFC3339);
case 1:
sg = INT2FIX(DEFAULT_SG);
}
{
int argc2 = 1;
VALUE argv2[2], hash;
argv2[0] = str;
argv2[1] = opt;
if (!NIL_P(opt)) argc2++;
hash = date_s__rfc2822(argc2, argv2, klass);
return dt_new_by_frags(klass, hash, sg);
}
}
Erstellt ein neues DateTime Objekt durch Parsen eines Strings gemäß typischen RFC 2822 Formaten.
DateTime.rfc2822('Sat, 3 Feb 2001 04:05:06 +0700') #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
Löst einen ArgumentError aus, wenn die Stringlänge größer als *limit* ist. Sie können diese Prüfung stoppen, indem Sie limit: nil übergeben, beachten Sie jedoch, dass das Parsen lange dauern kann.
Source
static VALUE
datetime_s_rfc3339(int argc, VALUE *argv, VALUE klass)
{
VALUE str, sg, opt;
argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
switch (argc) {
case 0:
str = rb_str_new2(JULIAN_EPOCH_DATETIME);
case 1:
sg = INT2FIX(DEFAULT_SG);
}
{
int argc2 = 1;
VALUE argv2[2], hash;
argv2[0] = str;
argv2[1] = opt;
if (!NIL_P(opt)) argc2++;
hash = date_s__rfc3339(argc2, argv2, klass);
return dt_new_by_frags(klass, hash, sg);
}
}
Erstellt ein neues DateTime Objekt durch Parsen eines Strings gemäß typischen RFC 3339 Formaten.
DateTime.rfc3339('2001-02-03T04:05:06+07:00') #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
Löst einen ArgumentError aus, wenn die Stringlänge größer als *limit* ist. Sie können diese Prüfung stoppen, indem Sie limit: nil übergeben, beachten Sie jedoch, dass das Parsen lange dauern kann.
Source
static VALUE
datetime_s_rfc2822(int argc, VALUE *argv, VALUE klass)
{
VALUE str, sg, opt;
argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
switch (argc) {
case 0:
str = rb_str_new2(JULIAN_EPOCH_DATETIME_RFC3339);
case 1:
sg = INT2FIX(DEFAULT_SG);
}
{
int argc2 = 1;
VALUE argv2[2], hash;
argv2[0] = str;
argv2[1] = opt;
if (!NIL_P(opt)) argc2++;
hash = date_s__rfc2822(argc2, argv2, klass);
return dt_new_by_frags(klass, hash, sg);
}
}
Erstellt ein neues DateTime Objekt durch Parsen eines Strings gemäß typischen RFC 2822 Formaten.
DateTime.rfc2822('Sat, 3 Feb 2001 04:05:06 +0700') #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
Löst einen ArgumentError aus, wenn die Stringlänge größer als *limit* ist. Sie können diese Prüfung stoppen, indem Sie limit: nil übergeben, beachten Sie jedoch, dass das Parsen lange dauern kann.
Source
static VALUE
datetime_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(JULIAN_EPOCH_DATETIME);
case 1:
fmt = rb_str_new2("%FT%T%z");
case 2:
sg = INT2FIX(DEFAULT_SG);
}
{
VALUE argv2[2], hash;
argv2[0] = str;
argv2[1] = fmt;
hash = date_s__strptime(2, argv2, klass);
return dt_new_by_frags(klass, hash, sg);
}
}
Parst die gegebene Darstellung von Datum und Uhrzeit mit der gegebenen Vorlage und erstellt ein DateTime Objekt. strptime unterstützt nicht die Angabe von Flags und Breiten im Gegensatz zu strftime.
DateTime.strptime('2001-02-03T04:05:06+07:00', '%Y-%m-%dT%H:%M:%S%z') #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...> DateTime.strptime('03-02-2001 04:05:06 PM', '%d-%m-%Y %I:%M:%S %p') #=> #<DateTime: 2001-02-03T16:05:06+00:00 ...> DateTime.strptime('2001-W05-6T04:05:06+07:00', '%G-W%V-%uT%H:%M:%S%z') #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...> DateTime.strptime('2001 04 6 04 05 06 +7', '%Y %U %w %H %M %S %z') #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...> DateTime.strptime('2001 05 6 04 05 06 +7', '%Y %W %u %H %M %S %z') #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...> DateTime.strptime('-1', '%s') #=> #<DateTime: 1969-12-31T23:59:59+00:00 ...> DateTime.strptime('-1000', '%Q') #=> #<DateTime: 1969-12-31T23:59:59+00:00 ...> DateTime.strptime('sat3feb014pm+7', '%a%d%b%y%H%p%z') #=> #<DateTime: 2001-02-03T16:00:00+07:00 ...>
Siehe auch strptime(3) und strftime.
Source
static VALUE
datetime_s_xmlschema(int argc, VALUE *argv, VALUE klass)
{
VALUE str, sg, opt;
argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
switch (argc) {
case 0:
str = rb_str_new2(JULIAN_EPOCH_DATETIME);
case 1:
sg = INT2FIX(DEFAULT_SG);
}
{
int argc2 = 1;
VALUE argv2[2], hash;
argv2[0] = str;
argv2[1] = opt;
if (!NIL_P(opt)) argc2++;
hash = date_s__xmlschema(argc2, argv2, klass);
return dt_new_by_frags(klass, hash, sg);
}
}
Erstellt ein neues DateTime Objekt durch Parsen eines Strings gemäß typischen XML Schema Formaten.
DateTime.xmlschema('2001-02-03T04:05:06+07:00') #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
Löst einen ArgumentError aus, wenn die Stringlänge größer als *limit* ist. Sie können diese Prüfung stoppen, indem Sie limit: nil übergeben, beachten Sie jedoch, dass das Parsen lange dauern kann.
Öffentliche Instanzmethoden
Source
# File ext/json/lib/json/add/date_time.rb, line 39 def as_json(*) { JSON.create_id => self.class.name, 'y' => year, 'm' => month, 'd' => day, 'H' => hour, 'M' => min, 'S' => sec, 'of' => offset.to_s, 'sg' => start, } end
Die Methoden DateTime#as_json und DateTime.json_create können zum Serialisieren und Deserialisieren eines DateTime-Objekts verwendet werden; siehe Marshal.
Die Methode DateTime#as_json serialisiert self und gibt einen 2-Element-Hash zurück, der self repräsentiert.
require 'json/add/datetime' x = DateTime.now.as_json # => {"json_class"=>"DateTime", "y"=>2023, "m"=>11, "d"=>21, "sg"=>2299161.0}
Die Methode JSON.create deserialisiert einen solchen Hash und gibt ein DateTime-Objekt zurück.
DateTime.json_create(x) # BUG? Raises Date::Error "invalid date"
Source
static VALUE
dt_lite_deconstruct_keys(VALUE self, VALUE keys)
{
return deconstruct_keys(self, keys, /* is_datetime=true */ 1);
}
Gibt einen Hash der Namen/Wert-Paare zurück, zur Verwendung in Mustervergleichen. Mögliche Schlüssel sind: :year, :month, :day, :wday, :yday, :hour, :min, :sec, :sec_fraction, :zone.
Mögliche Verwendungen
dt = DateTime.new(2022, 10, 5, 13, 30) if d in wday: 1..5, hour: 10..18 # uses deconstruct_keys underneath puts "Working time" end #=> prints "Working time" case dt in year: ...2022 puts "too old" in month: ..9 puts "quarter 1-3" in wday: 1..5, month: puts "working day in month #{month}" end #=> prints "working day in month 10"
Beachten Sie, dass die Dekonstruktion per Muster auch mit Klassenprüfungen kombiniert werden kann.
if d in DateTime(wday: 1..5, hour: 10..18, day: ..7) puts "Working time, first week of the month" end
Source
static VALUE
d_lite_hour(VALUE self)
{
get_d1(self);
return INT2FIX(m_hour(dat));
}
Gibt die Stunde im Bereich (0..23) zurück.
DateTime.new(2001, 2, 3, 4, 5, 6).hour # => 4
Source
static VALUE
dt_lite_iso8601(int argc, VALUE *argv, VALUE self)
{
long n = 0;
rb_check_arity(argc, 0, 1);
if (argc >= 1)
n = NUM2LONG(argv[0]);
return rb_str_append(strftimev("%Y-%m-%d", self, set_tmx),
iso8601_timediv(self, n));
}
Diese Methode ist äquivalent zu strftime(‘%FT%T%:z’). Das optionale Argument n ist die Anzahl der Ziffern für Bruchteile von Sekunden.
DateTime.parse('2001-02-03T04:05:06.123456789+07:00').iso8601(9) #=> "2001-02-03T04:05:06.123456789+07:00"
Source
static VALUE
dt_lite_jisx0301(int argc, VALUE *argv, VALUE self)
{
long n = 0;
rb_check_arity(argc, 0, 1);
if (argc >= 1)
n = NUM2LONG(argv[0]);
return rb_str_append(d_lite_jisx0301(self),
iso8601_timediv(self, n));
}
Gibt einen String im JIS X 0301 Format zurück. Das optionale Argument n ist die Anzahl der Ziffern für Bruchteile von Sekunden.
DateTime.parse('2001-02-03T04:05:06.123456789+07:00').jisx0301(9) #=> "H13.02.03T04:05:06.123456789+07:00"
Source
static VALUE
d_lite_min(VALUE self)
{
get_d1(self);
return INT2FIX(m_min(dat));
}
Gibt die Minute im Bereich (0..59) zurück.
DateTime.new(2001, 2, 3, 4, 5, 6).min # => 5
Source
static VALUE
d_lite_new_offset(int argc, VALUE *argv, VALUE self)
{
VALUE vof;
int rof;
rb_scan_args(argc, argv, "01", &vof);
rof = 0;
if (argc >= 1)
val2off(vof, rof);
return dup_obj_with_new_offset(self, rof);
}
Dupliziert self und setzt seinen Offset zurück.
d = DateTime.new(2001,2,3,4,5,6,'-02:00') #=> #<DateTime: 2001-02-03T04:05:06-02:00 ...> d.new_offset('+09:00') #=> #<DateTime: 2001-02-03T15:05:06+09:00 ...>
Source
static VALUE
d_lite_offset(VALUE self)
{
get_d1(self);
return m_of_in_day(dat);
}
Gibt den Offset zurück.
DateTime.parse('04pm+0730').offset #=> (5/16)
Source
static VALUE
dt_lite_rfc3339(int argc, VALUE *argv, VALUE self)
{
return dt_lite_iso8601(argc, argv, self);
}
Diese Methode ist äquivalent zu strftime(‘%FT%T%:z’). Das optionale Argument n ist die Anzahl der Ziffern für Bruchteile von Sekunden.
DateTime.parse('2001-02-03T04:05:06.123456789+07:00').rfc3339(9) #=> "2001-02-03T04:05:06.123456789+07:00"
Source
static VALUE
d_lite_sec(VALUE self)
{
get_d1(self);
return INT2FIX(m_sec(dat));
}
Gibt die Sekunde im Bereich (0..59) zurück.
DateTime.new(2001, 2, 3, 4, 5, 6).sec # => 6
Source
static VALUE
d_lite_sec_fraction(VALUE self)
{
get_d1(self);
return m_sf_in_sec(dat);
}
Gibt den Bruchteil der Sekunde im Bereich (Rational(0, 1)…Rational(1, 1)) zurück.
DateTime.new(2001, 2, 3, 4, 5, 6.5).sec_fraction # => (1/2)
Source
static VALUE
dt_lite_strftime(int argc, VALUE *argv, VALUE self)
{
return date_strftime_internal(argc, argv, self,
"%Y-%m-%dT%H:%M:%S%:z", set_tmx);
}
Gibt eine String-Darstellung von self zurück, formatiert gemäß dem gegebenen +format
DateTime.now.strftime # => "2022-07-01T11:03:19-05:00"
Für andere Formate siehe Formate für Daten und Zeiten
Source
static VALUE
datetime_to_date(VALUE self)
{
get_d1a(self);
if (simple_dat_p(adat)) {
VALUE new = d_lite_s_alloc_simple(cDate);
{
get_d1b(new);
bdat->s = adat->s;
bdat->s.jd = m_local_jd(adat);
return new;
}
}
else {
VALUE new = d_lite_s_alloc_simple(cDate);
{
get_d1b(new);
copy_complex_to_simple(new, &bdat->s, &adat->c);
bdat->s.jd = m_local_jd(adat);
bdat->s.flags &= ~(HAVE_DF | HAVE_TIME | COMPLEX_DAT);
return new;
}
}
}
Gibt ein Date Objekt zurück, das self bezeichnet.
Source
static VALUE
datetime_to_datetime(VALUE self)
{
return self;
}
Gibt self zurück.
Source
# File ext/json/lib/json/add/date_time.rb, line 62 def to_json(*args) as_json.to_json(*args) end
Gibt einen JSON-String zurück, der self repräsentiert
require 'json/add/datetime' puts DateTime.now.to_json
Ausgabe
{"json_class":"DateTime","y":2023,"m":11,"d":21,"sg":2299161.0}
Source
static VALUE
dt_lite_to_s(VALUE self)
{
return strftimev("%Y-%m-%dT%H:%M:%S%:z", self, set_tmx);
}
Gibt einen String im ISO 8601 Format zurück. (Diese Methode verwendet nicht die erweiterten Darstellungen.)
DateTime.new(2001,2,3,4,5,6,'-7').to_s #=> "2001-02-03T04:05:06-07:00"
Source
static VALUE
datetime_to_time(VALUE self)
{
get_d1(self);
if (m_julian_p(dat)) {
VALUE g = d_lite_gregorian(self);
get_d1a(g);
dat = adat;
self = g;
}
{
VALUE t;
t = rb_funcall(rb_cTime,
rb_intern("new"),
7,
m_real_year(dat),
INT2FIX(m_mon(dat)),
INT2FIX(m_mday(dat)),
INT2FIX(m_hour(dat)),
INT2FIX(m_min(dat)),
f_add(INT2FIX(m_sec(dat)),
m_sf_in_sec(dat)),
INT2FIX(m_of(dat)));
RB_GC_GUARD(self); /* may be the converted gregorian */
return t;
}
}
Gibt ein Time Objekt zurück, das self bezeichnet.
Diese Methode ist äquivalent zu strftime(‘%FT%T%:z’). Das optionale Argument n ist die Anzahl der Ziffern für Bruchteile von Sekunden.
DateTime.parse('2001-02-03T04:05:06.123456789+07:00').iso8601(9) #=> "2001-02-03T04:05:06.123456789+07:00"
Source
static VALUE
d_lite_zone(VALUE self)
{
get_d1(self);
return m_zone(dat);
}
Gibt die Zeitzone zurück.
DateTime.parse('04pm+0730').zone #=> "+07:30"