[#56965] [ruby-trunk - Bug #8852][Open] Synology build of ruby-2.0.0-p247 is failing — "barbecuesteve (Steve Sparks)" <sparks@...>

12 messages 2013/09/02

[#57051] [ruby-trunk - Bug #8872][Open] Case statements do not honor a refinement of the '===' method — "jconley88 (Jon Conley)" <schnozberries@...>

21 messages 2013/09/07

[#57058] [ruby-trunk - Bug #8875][Open] Select is not usable with SSLSocket — "headius (Charles Nutter)" <headius@...>

11 messages 2013/09/07

[#57074] [ruby-trunk - Bug #8879][Open] String#to_r fails after moving ruby to other OSX system — "mpapis (Michal Papis)" <mpapis@...>

12 messages 2013/09/08

[#57092] [ruby-trunk - Bug #8883][Open] Rational canonicalization unexpectedly converts to Fixnum — "melquiades (Paul Cantrell)" <cantrell@...>

16 messages 2013/09/09

[#57109] [ruby-trunk - Bug #8886][Open] TracePoint API inconsistence when raise used — deivid (David Rodríguez) <deivid.rodriguez@...>

14 messages 2013/09/10

[#57111] [ruby-trunk - Feature #8887][Open] min(n), max(n), min_by(n), max_by(n) — "akr (Akira Tanaka)" <akr@...>

13 messages 2013/09/10

[#57131] [ruby-trunk - Feature #8895][Open] Destructuring Assignment for Hash — "chendo (Jack Chen)" <ruby-lang@...>

19 messages 2013/09/11

[#57186] [ruby-trunk - Feature #8909][Open] Expand "f" frozen suffix to literal arrays and hashes — "headius (Charles Nutter)" <headius@...>

37 messages 2013/09/14

[#57262] [ruby-trunk - Feature #8921][Open] Allow select, reject, etc to accept a regex — "kyledecot (Kyle Decot)" <kyle.decot@...>

13 messages 2013/09/18

[#57273] [ruby-trunk - Feature #8923][Open] Frozen nil/true/false — "ko1 (Koichi Sasada)" <redmine@...>

13 messages 2013/09/19

[#57353] [ruby-trunk - Feature #8948][Open] Frozen regex — "sawa (Tsuyoshi Sawada)" <sawadatsuyoshi@...>

19 messages 2013/09/24

[#57385] [ruby-trunk - Bug #8953][Open] `str =~ /pattern/` does not call =~ method if (1) str is a String, (2) /pattern/ is a Regexp literal — "gfx (Goro Fuji)" <gfuji@...>

12 messages 2013/09/26

[#57396] [ruby-trunk - Feature #8956][Open] Allow hash members delimited by \n inside of {} — "adamdunson (Adam Dunson)" <adam@...>

20 messages 2013/09/26

[ruby-core:57027] [ruby-trunk - Bug #7445] strptime('%s %z') doesn't work

From: "tadf (tadayoshi funaba)" <redmine@...>
Date: 2013-09-04 22:38:19 UTC
List: ruby-core #57027
Issue #7445 has been updated by tadf (tadayoshi funaba).


俺の英語は通用しないらしいから日本語で書いてあげます。

あなたこそ DateTime の話をしている事を忘れないで下さい。

参照でその先に書いてある事がそのまま通用するわけではありません。参照は
理解を深めるための参考に過ぎません。当たり前です。常識です。

more(1) より引用
>SEE ALSO
>     vi(1), less(1)

more は less と等価か? 並外れてますね。

そもそも、もう言った筈ですけれど、あなたが言うように '%s %z' が完璧に機
能するなんて事はありません。あなたが言っているのは、構文レベルで「読め
た」というだけでしょう。それは、_strptime で出来ますと説明しました。そ
もそも C の場合、タイムゾーンのメンバーは標準ではありません。元からタイ
ムゾーンや時差について対称でありません。なんなら、ruby の組み込みクラス
Time でどのようにやるのか見せて下さい。

lcoaltime(3) より引用
>           struct tm {
>               int tm_sec;         /* seconds */
>               int tm_min;         /* minutes */
>               int tm_hour;        /* hours */
>               int tm_mday;        /* day of the month */
>               int tm_mon;         /* month */
>               int tm_year;        /* year */
>               int tm_wday;        /* day of the week */
>               int tm_yday;        /* day in the year */
>               int tm_isdst;       /* daylight saving time */
>           };

DateTime だけでなく、組み込みクラスの Time も、C のライブラリも同じです
が、正しく受け入れるには、構文レベルだけでなく、その意味を解釈しなけれ
ばなりません。矛盾する要素や最初から当てにしていないものは無視される事
になります。あなたはまったくそこに気付かないふりをして胡麻化しています。

%s は time_t を意図していますが、struct tm にはそのようなメンバーはない
ので実際には、分解されて自明の地方時として格納される筈です。仮に時差が
格納されていたとしてもそれは少しおかしい事だと気づなかければいけません。
その時差が地方時のそれと一致していればいいでしょうが、そうとは限りませ
ん。そもそも格納されるかどうかは実装次第でしょう。mktime(3) がそれを無
視すれば辻褄が合います。いずれにしてもこのあたりの振舞いは未定義だと思
います。俺達が議論する意義はないです。

#define _XOPEN_SOURCE
#include <stdio.h>
#include <time.h>

int main(int argc, char *argv[]) {
  struct tm tm;
  char buf[100];
  strptime(argv[1], argv[2], &tm);
  strftime(buf, 100, "%F %T %z", &tm);
  printf("%s\n", buf);
  return 0;
}

$ ./a.out '3 +0100' '%s %z'
1970-01-01 09:00:03 +0100
$ ./a.out '3 -0100' '%s %z'
1970-01-01 09:00:03 -0100

この場合、たしかに時差は読みこまれてはいました。

$ date -d '1970-01-01 09:00:03 +0100' +%s
28803
$ date -d '1970-01-01 09:00:03 -0100' +%s
36003

でも、ただ読んでるだけです。対称性がどうとかいう話じゃないんです。

DateTime や Time のインスタンスはオブジェクトなので、mktime(3) 的なもの
を排除できません。矛盾する要素を孕んでそのままにしておく事は DateTimeや
Time ではありえません。オブジェクトは struct tm ではありません。あなた
が言っている事は実際には C でも機能していないし、DateTime でもそのよう
な用意をするつもりもないです。あなたの言ってる事はてんで出鱈目です。

> Time.strptime('1 +1200', '%s %z')
#=> 1970-01-01 09:00:01 +0900
> Time.strptime('1 +2400', '%s %z')
#=> 1970-01-01 09:00:01 +0900

実際の所、意味のない組み合わせは他にもあります。それに対して、いちいち
正しい解釈を用意しようとは思いません。この件であなたの言うように修正す
れば、それで完璧な対称性が得られるわけではないのです。

> Time.strptime('1 0', '%s %w').wday
#=> 4

> Time.strptime('1 PM', '%s %p').hour
#=> 9

> DateTime.new(2001,2,3,16,5,6).strftime('%F %T %p')
#=> "2001-02-03 16:05:06 PM"
> DateTime.strptime('%F %T %p', "2001-02-03 16:05:06 PM")
ArgumentError: invalid date

俺は '%s %z' なんて書式の日付は見た事がありません。タイムゾーンや時差が
必要なのは、本質的にそれが地方時だからでしょう。%s が示しているのは、
time_t で、time_t にはタイムゾーンや時差の情報はありません。Unix ではそ
れは所与のものとして、自明なもの、説明する必要のないものとして、ただひ
とつあるだけ、これが基本です。

たとえば、ISO 8601 を見てみましょう。地方時に時差はあるが協定世界時には
ないでしょう。これを積極的に受け入れる理由がわかりません。少くともバグ
ではありません。あなたが受け入れて当然のように言う根拠がわかりません。

俺はタイムゾーンや時差は修飾語のようなものだと思っていますが、'%s %z'
では対象になるものがありません。'%s %p' なんかも同じです。こういうもの
に意味を与えなければならないとは思いません。

あなたが表現しようとしている '%s %z' は日付としておかしいと思います。そ
れを無理に解釈するならば、日付ではなくて、日付オブジェクトの不完全なコ
ピーのようなものにすぎないと思います。

それから、time_t は閏秒を含む場合があるので、移植性が乏しいです。だから、
これが色々な所で読み書き出来たとしても、あまり積極的に利用を勧められる
ようなものではないという事も言っておきたいです。ruby の組み込みクラスに
対してすら通用しない事を無理してやる意義を感じません。新しい機能として
ならまだしも「これはバグでした。バグが直ったからドンドンつかって下さい」
とは絶対に言いたくありません。

あるいは将来、未定義の振舞いとして有り得るのかもしれません。しかし、今
の所、受け入れたいとは全く思いません。逆に今すぐ受け入れなければならな
い理由はあるのでしょうか。今まで誰にも文句を言われた事はありません、あ
なた以外には。

コードを見ればわかりますが、意識的に無視しています。意図してやってます。
今も考えは変っていませんし、あなたに説得される気がしません。これで納得
できない場合は他のエライ人に相談して下さい。

俺の結論は「これはバグじゃない」です。

----------------------------------------
Bug #7445: strptime('%s %z') doesn't work
https://bugs.ruby-lang.org/issues/7445#change-41622

Author: felipec (Felipe Contreras)
Status: Rejected
Priority: Low
Assignee: tadf (tadayoshi funaba)
Category: lib
Target version: Next Major
ruby -v: ruby 1.9.3p327
Backport: 


See:

    ruby -e "require 'date'; p DateTime.strptime('0 +0100', '%s %z').strftime('%s %z')"

The timezone is ignored.


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

In This Thread