Issue #9794 has been updated by tadayoshi funaba.


言語の問題もあるんだろうけど、俺が英語に堪能でも Felipe Contreras に俺の考えを解らせるのは無理じゃないかという気がする。

誤解のないよう少し補足しておくと、strcut tm で %s や %z を表現できない、という直接的な問題でもない。
C の時刻関数群はオブジェクト指向では書かれてないけど、データや関数の集合によってどんなモノを表現しているのか
考えないと理解できない。C の時刻関数には、まず、地方時 (あるいは局所時) と世界時の区別しかなく、
基本的に地方時は与えられるもので自分では選べない。選べないという事は、strptime に与えて仮に形式的に受けつけたとしても
仕様に従えば、mktime (自明の地方時) や gmtime (世界時) ではそれを使う事ができないという事になる。
それに、%z に対応するメンバーがあっても、普通は %s に対応するものがない、
だから %s は年月日などにデコードされるが、
これも自明な地方時か世界時しか選択肢がない。時差を持っていても矛盾が生じてしまう。
これは https://bugs.ruby-lang.org/issues/7445#note-12 ですでに書いた。

そもそも %s は可搬性に乏しい (存在しない実装もあるだろうし、閏秒の挿入の課題がある)。
環境によっては、ruby の Time と DateTime でも結果に相違が出る。そういうものです。

これまでにも「オレのアプリケーションで使っている日付をサポートしろ」という要求は
何度もありました (最近はないが直接メールしてくる奴もいる)。
いくつか受け入れたものもありますが、そういうの一々受け入れていこうとはまったく思っていません。

俺は strptime が完璧だとは思ってないし、偏見の塊かもしれないと思っている。
田中さんなんかはそういう割切り方に自信があって、なおかつダメなものは諦めるしないと思っているのかもしれないけど、
俺の場合、少なくとも strptime については次善の策を用意しておいた。
_strptime は lib/time.rb に使って貰う為に用意したわけではない。
strptime でダメでも _strptime を叩いてどうにかなるかもしれない。
今回の件は明かに何とかなるでしょ。

'%s %z' はそれ自体おかしいと思うし、既に何度も述べているように、まるでお勧めできない。

その程度のものに原則を曲げて敢て対応する必要はないと思ってます。

大騒ぎすれば言う事を聞くと思ってるかもしれないけど、大間違いです。


----------------------------------------
Bug #9794: DateTime.strptime() doesn't work correctly for '%s %z'
https://bugs.ruby-lang.org/issues/9794#change-46471

* Author: Felipe Contreras
* Status: Feedback
* Priority: Low
* Assignee: tadayoshi funaba
* Category: ext
* Target version: 
* ruby -v: 2.1.1p76
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN
----------------------------------------
Time.strptime() works correctly:

    Time.strptime('0 +0100', '%s %z').strftime('%s %z')
    => "0 +0100"

But DateTime.strptime() doesn't:

    DateTime.strptime('0 +0100', '%s %z').strftime('%s %z')
    => "0 +0000"

In Rubinious it does work correctly:

    DateTime.strptime('0 +0100', '%s %z').strftime('%s %z')
    => "0 +0100"

This make the RubySL date space fail:

    DateTime#strptime parses seconds and timezone correctly FAILED
    Expected "1970-01-01T00:00:00+00:00"
     to equal "1970-01-01T01:00:00+01:00"

In addition, both C and perl preserver the offset correctly when doing '%s %z'.

So it's very clear DateTime.strptime() has to be fixed.

Patch attached.

---Files--------------------------------
0001-datetime-fix-strptime-s-z.patch (1.94 KB)


-- 
https://bugs.ruby-lang.org/