Issue #9794 has been updated by tadayoshi funaba.


Akira Tanaka wrote:
> tadayoshi funaba wrote:
>  
> > 日付としておかしいからです。
> 
> おかしい、というのはどういう意味でしょう?
> 
> たしかに "%s %z" は人間が日常的に扱う形式ではありません。
> でも、%s が過去から未来への流れの中の 1点を指定し、
> %z がその 1点の表現方法を UTC からの offset という形でを指定する、
> という時刻の形式だと解釈できると思います。

見慣れないという意味ではないです。ユリウス日のようなものも日付だと思ってますし、%s 単体では特に問題に思っていません。

全然理解できないのですが、%s に時差って意味ないですよね。
田中さんはそこにオブジェクトを見てるから不自然とは感じないという事ですかね。

> もしそうだとすると、私はそのようには考えていません。
> %s と %z が示す情報は独立なものだと考えています。
> 
> 上の繰り返しになってしまうのですが、以下のように考えています。
> * %s は過去から未来への流れの中の 1点を指定する
> * %z はその 1点の表現方法を指定する

やっぱりおかしいですね。%s の表現方法は繰り返しですが %s です。
日付じゃなくて、オブジェクトの操作ですよね。

> > 逆にこれを導入しなければならない強い動機が俺にはわかりません。
> 
> git で使われているからという動機は述べられているんじゃないでしょうか。

git に従う理由がありません。しかも ruby でそれが表現できないわけでも
解析できないわけでもありません。

> > 逆に俺からすると、Time.strptime が互換性、統一性を捨てたのがかなり疑問です。
> > 俺は元に戻す事を提案しておきます。
> 
> ここでいう互換性、統一性とはなんでしょう?
> また、元というのはどの段階でしょう?

Time.strptime('0 -0200', '%s %z')
#=> 1969-12-31 22:00:00 -0200
Time.strptime('20010203 -0200', '%Y%m%d %z')
#=> 2001-02-03 11:00:00 +0900

明らかに統一性がないと思います。
以前は %s も含めて時差はすべて無視されていました。
これは Time の元からの仕様なので気にしていませんでしが、
今はおかしな事になっていると思います。


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

* Author: Felipe Contreras
* Status: Rejected
* 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/