Forum: Ruby-core DateTime.strptime() doesn't work correctly for '%s %z'

31e9336577dcba34f9ea8025a763c900?d=identicon&s=25 unknown (Guest)
on 2014-05-04 10:50
(Received via mailing list)
Issue #9794 has been updated by tadayoshi funaba.

Akira Tanaka wrote:
> tadayoshi funaba wrote:

> もしかして、DateTime.strptime に与えるフォーマットに時刻 (時間軸上の点) を同定するのに関係しない要素は与えるべきでない、
> と感じるという話でしょうか。


`s = 'Sunday 4 May <unknown garbage> 2014; blob'
h = Date._strptime(s, '%a %d %b')
s2 = h[:leftover].gsub(/ *<.*> */, '')
h2 = Date._strptime(s2, '%Y')`

h.merge(h2) #=> {:wday=>0, :mday=>4, :mon=>5, :leftover=>"; blob",

もちろん strptime でも。

Bug #9794: DateTime.strptime() doesn't work correctly for '%s %z'

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

0001-datetime-fix-strptime-s-z.patch (1.94 KB)
This topic is locked and can not be replied to.