From: naruse@... Date: 2015-06-04T14:47:24+00:00 Subject: [ruby-dev:49027] [Ruby trunk - Feature #11220] strptime(%6N) Issue #11220 has been updated by Yui NARUSE. Description updated ---------------------------------------- Feature #11220: strptime(%6N) https://bugs.ruby-lang.org/issues/11220#change-52753 * Author: Yui NARUSE * Status: Open * Priority: Normal * Assignee: ---------------------------------------- strftimeにはマイクロ秒などでの出力を指定する、%6N, %9Nというフォーマットがあります。 一方で、パースを行うstrptimeにはそのような指定子が現在ありません。 そのようなものに対するニーズはぼちぼちあるようなので入れませんか。 http://answers.splunk.com/answers/1946/time-format-and-subseconds.html https://twitter.com/nalsh/status/606414387352502272 ``` diff --git a/ext/date/date_strptime.c b/ext/date/date_strptime.c index e318af1..89a6421 100644 --- a/ext/date/date_strptime.c +++ b/ext/date/date_strptime.c @@ -611,6 +611,33 @@ date__strptime_internal(const char *str, size_t slen, recur("%a %b %e %H:%M:%S %Z %Y"); goto matched; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + { + VALUE n; + size_t w; + int sign = 1; + size_t osi; + w = read_digits(&fmt[fi], &n, 1); + fi += w; + w = NUM2SIZET(n); + + if (issign(str[si])) { + if (str[si] == '-') + sign = -1; + si++; + } + osi = si; + READ_DIGITS(n, w == 0 ? 9 : w) + if (sign == -1) + n = f_negate(n); + set_hash("sec_fraction", + rb_rational_new2(n, + f_expt(INT2FIX(10), + ULONG2NUM(si - osi)))); + goto matched; + } + default: if (str[si] != '%') fail(); ``` -- https://bugs.ruby-lang.org/