Issue #9794 has been updated by tadayoshi funaba.


Akira Tanaka wrote:
> tadayoshi funaba wrote:

> 曜日と年月日とは異なり、%s と %z は独立なので問題ないと思います。
> ここで独立というのは直交しているという意味で、片方を変えてももう一方は変わりません。

問題があるとかでなく、別のものなってるという事です。
たとえば、可能性としては、UTCで書いた日付を地方時にという事も出来るという事ですよね。
今回 %s だけですが。

俺は今、日本にいてUTCの時刻を扱っているとします。
それを例えば以下のように記述する事にします。
与えられた時刻はUTCだけど、それを +09:00 で参照する事にします。

2001-02-03T04:05:06 UTC (+0900)

一般的でないので、
DateTime.parse('2001-02-03T04:05:06 UTC').new_offset('+0900')
といったような操作で説明する事になります。

今現在このような記述は ruby ではないですが、'%s %z' の件で求められているのは、俺からするとこういうものを含む、これまで扱っていたものとは別のものだと感じています。

> 日付とはなにかとか、そういうことをもうすこし詳しく述べていただけると、理解が可能になるのかもしれません。

俺が日付と言ってるのはそういう時刻も含まれてます。
この日付というのはある規則に基づいて時間軸上に振られた名前のようなものだと思っています。空間に置き換えるとマイルストーンのようなものです。
実際にはもっと不完全な日付もあって、それも日付です。
文脈やその他の情報から特定できる場合もあるし、出来ない事もあります。

> > 時差に特別な意味があると思えば地方時で記述すればいいと思います。
> 
> どこの地方時かというのが問題で、OS に設定された地方時じゃなくて、
> UTC からの時差が固定されている人工的な地方時を選んだほうが、
> 与えられた時差をそのまま記録できる、という話だと理解しています。

ちょっと意味が判りませんでした。

%s がそもそも不完全と思えるので、なぜこんなに拘るのはわかりません。

%s を空間に置き換えてみると、これでマイルストーンは置けず、ただ距離が示されているだけ、距離の定義がわかない状態ではないですか。

あと、ついでなので、田中さんが固定時差と言ってるものも万能でない事は確認しておきたいです。

与えられた自明の地方時も有用で、時差ではなくタイムゾーン=時間帯の情報は
単なる時差以上の情報を含んでいます。

夏時間など実際に我々が参照している時系と形式は重要じゃないですか。
そういう意味も含めて、%s 偏重の流れに違和感を感じます。



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

* 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/