[前][次][番号順一覧][スレッド一覧]

ruby-changes:55405

From: nobu <ko1@a...>
Date: Fri, 19 Apr 2019 17:53:44 +0900 (JST)
Subject: [ruby-changes:55405] nobu:r67613 (trunk): time.c: added in: option to Time.now

nobu	2019-04-19 17:53:40 +0900 (Fri, 19 Apr 2019)

  New Revision: 67613

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=67613

  Log:
    time.c: added in: option to Time.now
    
    * time.c (time_s_now): added in: option to Time.now as well as
      Time.at.

  Modified files:
    trunk/test/ruby/test_time_tz.rb
    trunk/time.c
Index: test/ruby/test_time_tz.rb
===================================================================
--- test/ruby/test_time_tz.rb	(revision 67612)
+++ test/ruby/test_time_tz.rb	(revision 67613)
@@ -582,6 +582,11 @@ module TestTimeTZ::WithTZ https://github.com/ruby/ruby/blob/trunk/test/ruby/test_time_tz.rb#L582
     assert_equal(time_class.utc(2018, 9, 1, 12+h, m, 0).to_i, t.to_i)
   end
 
+  def subtest_now(time_class, tz, tzarg, tzname, abbr, utc_offset)
+    t = time_class.now(in: tzarg)
+    assert_equal(tz, t.zone)
+  end
+
   def subtest_getlocal(time_class, tz, tzarg, tzname, abbr, utc_offset)
     t = time_class.utc(2018, 9, 1, 12, 0, 0).getlocal(tzarg)
     h, m = (utc_offset / 60).divmod(60)
Index: time.c
===================================================================
--- time.c	(revision 67612)
+++ time.c	(revision 67613)
@@ -2671,6 +2671,22 @@ rb_time_timespec(VALUE time) https://github.com/ruby/ruby/blob/trunk/time.c#L2671
     return time_timespec(time, FALSE);
 }
 
+enum {
+    TMOPT_IN,
+    TMOPT_MAX_
+};
+
+static bool
+get_tmopt(VALUE opts, VALUE vals[TMOPT_MAX_])
+{
+    ID ids[TMOPT_MAX_];
+
+    if (NIL_P(opts)) return false;
+    CONST_ID(ids[TMOPT_IN], "in");
+    rb_get_kwargs(opts, ids, 0, TMOPT_MAX_, vals);
+    return true;
+}
+
 /*
  *  call-seq:
  *     Time.now -> time
@@ -2682,9 +2698,16 @@ rb_time_timespec(VALUE time) https://github.com/ruby/ruby/blob/trunk/time.c#L2698
  */
 
 static VALUE
-time_s_now(VALUE klass)
+time_s_now(int argc, VALUE *argv, VALUE klass)
 {
-    return rb_class_new_instance(0, NULL, klass);
+    VALUE vals[TMOPT_MAX_], opts, t, zone = Qundef;
+    rb_scan_args(argc, argv, ":", &opts);
+    if (get_tmopt(opts, vals)) zone = vals[TMOPT_IN];
+    t = rb_class_new_instance(0, NULL, klass);
+    if (zone != Qundef) {
+        time_zonelocal(t, zone);
+    }
+    return t;
 }
 
 static int
@@ -2746,15 +2769,11 @@ static VALUE https://github.com/ruby/ruby/blob/trunk/time.c#L2769
 time_s_at(int argc, VALUE *argv, VALUE klass)
 {
     VALUE time, t, unit = Qundef, zone = Qundef, opts;
+    VALUE vals[TMOPT_MAX_];
     wideval_t timew;
 
     argc = rb_scan_args(argc, argv, "12:", &time, &t, &unit, &opts);
-    if (!NIL_P(opts)) {
-        ID ids[1];
-        VALUE vals[numberof(ids)];
-
-        CONST_ID(ids[0], "in");
-        rb_get_kwargs(opts, ids, 0, 1, vals);
+    if (get_tmopt(opts, vals)) {
         zone = vals[0];
     }
     if (argc >= 2) {
@@ -5577,7 +5596,7 @@ Init_Time(void) https://github.com/ruby/ruby/blob/trunk/time.c#L5596
     rb_include_module(rb_cTime, rb_mComparable);
 
     rb_define_alloc_func(rb_cTime, time_s_alloc);
-    rb_define_singleton_method(rb_cTime, "now", time_s_now, 0);
+    rb_define_singleton_method(rb_cTime, "now", time_s_now, -1);
     rb_define_singleton_method(rb_cTime, "at", time_s_at, -1);
     rb_define_singleton_method(rb_cTime, "utc", time_s_mkutc, -1);
     rb_define_singleton_method(rb_cTime, "gm", time_s_mkutc, -1);

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]