Bug #437

test_strftime(TestTime) fails on Solaris

Added by Shugo Maeda over 6 years ago. Updated almost 4 years ago.

[ruby-dev:35845]
Status:Closed
Priority:Normal
Assignee:Shugo Maeda
ruby -v: Backport:

Description

=begin
test_strftime(TestTime) fails on Solaris.

$ ./ruby-trunk test/ruby/test_time.rb
Loaded suite test/ruby/test_time
Started
..................F...........
Finished in 0.017662724 seconds.

 1) Failure:

test_strftime(TestTime) [test/ruby/test_time.rb:374]:
is not true.

strftime("%Z") seems always to return the local time zone.

$ ./ruby-trunk -e 'p Time.now.gmtime'

2008-08-13 14:27:31 UTC
$ ./ruby-trunk -e 'p Time.now.gmtime.strftime("%Z")'
"JST"
=end

History

#1 Updated by Shugo Maeda over 6 years ago

=begin
前田です。
# Redmineのレポート先を間違えてruby-devにしてしまったので日本語で。

2008/08/13 23:27 Shugo Maeda redmine@ruby-lang.org:

strftime("%Z") seems always to return the local time zone.

$ ./ruby-trunk -e 'p Time.now.gmtime'
2008-08-13 14:27:31 UTC
$ ./ruby-trunk -e 'p Time.now.gmtime.strftime("%Z")'
"JST"

どうもSolarisだとstrftime(3)自体が常にローカルのタイムゾーン情報を
返すようです。
簡単な解決としては、添付のパッチのような方法しか思い付きませんでし
たが、もっと上手い解決方法があれば教えてください。
# ほんとは全部自前で実装するのがよいのでしょうが…。

--
Shugo Maeda

Attachment: strftime.diff
=end

#2 Updated by Yukihiro Matsumoto over 6 years ago

=begin
まつもと ゆきひろです

In message "Re: Re: [Bug #437] test_strftime(TestTime) fails on Solaris"
on Fri, 15 Aug 2008 17:21:34 +0900, SATOH Fumiyasu fumiyas@osstech.jp writes:

|At Fri, 15 Aug 2008 16:59:30 +0900,
|Shugo Maeda wrote:
|> どうもSolarisだとstrftime(3)自体が常にローカルのタイムゾーン情報を
|> 返すようです。
|
|ふつう(?) の struct tm にはタイムゾーンの情報が
|含まれないので、システム設定か TZ 環境変数に従うしかない
|のだと思います。

なんと、残念な。

|ということで、
|
|> +#ifdef BROKEN_STRFTIME_Z
|
|「BROKEN」ではなく仕様ですね。

では、BROKENでない単語を使って(NOGMTOFFとか)コミットしていた
だけませんか > 前田さん

=end

#3 Updated by Yusuke Endoh over 6 years ago

=begin
遠藤です。

2008/08/15 17:21 SATOH Fumiyasu fumiyas@osstech.jp:

+#ifdef BROKEN_STRFTIME_Z

「BROKEN」ではなく仕様ですね。

嘘の出力を返すのは、やはり BROKEN な気がします。
Solaris 10 の strftime(3C) によると

  %Z       Time zone name or abbreviation, or no bytes  if  no
           time zone information exists.

らしいので、no bytes なら納得できるんですけど。

--
Yusuke ENDOH mame@tsg.ne.jp

=end

#4 Updated by Yusuke Endoh over 6 years ago

=begin
遠藤です。

2008/08/16 2:43 SATOH Fumiyasu fumiyas@osstech.jp:

Solaris 10 の strftime(3C) によると

 %Z       Time zone name or abbreviation, or no bytes  if  no
          time zone information exists.

らしいので、no bytes なら納得できるんですけど。

Solaris は、struct tm にも、strftime(3C) に載っている
cftime(3C) が受けとる time_t にもタイムゾーン情報は
含まれていないのですから、「if 〜」をそのように解釈するのは
不自然です。

英語のほうがオリジナルなんでしょうが、日本語の
strftime(3C) によると:

%Z    タイムゾーン名または省略形 (タイムゾーンがない場合には
      文字なし)

なので、該当するタイムゾーン情報 (/usr/share/lib/zoneinfo?) が
存在しない場合、のように読めます。(私には)

書かれた意図はそんな感じだろうなあと思いましたが、厳密に解釈すると
ここは no bytes であるべきだと考えました。

が、この件は SUSv3 に明記されてました。

If a struct tm broken-down time structure is created by localtime() or
localtime_r(), or modified by mktime(), and the value of TZ is
subsequently modified, the results of the %Z and %z strftime()
conversion specifiers are undefined, when strftime() is called with
such a broken-down time structure.

If a struct tm broken-down time structure is created or modified by
gmtime() or gmtime_r(), it is unspecified whether the result of the %Z
and %z conversion specifiers shall refer to UTC or the current local
timezone, when strftime() is called with such a broken-down time
structure.

というわけで完璧にさいとうさんがおっしゃるとおりの仕様のようです。
すみません。

--
Yusuke ENDOH mame@tsg.ne.jp

=end

#5 Updated by Yusuke Endoh over 6 years ago

=begin
遠藤です。

2008/08/16 3:27 Yusuke ENDOH mame@tsg.ne.jp:

というわけで完璧にさいとうさんがおっしゃるとおりの仕様のようです。

さとうさんでした。重ね重ね失礼しました。

--
Yusuke ENDOH mame@tsg.ne.jp

=end

#6 Updated by Shugo Maeda over 6 years ago

=begin
前田です。

2008/08/20 23:46 Yukihiro Matsumoto matz@ruby-lang.org:

|とりあえず、作業してみました。パッチを添付します。

コミットしてください。

先ほどコミットしました。

|i686-linux/i386-solaris2.10で確認したかぎりではtest_time.rbも
|通るようになりました。
|ただ、他のプラットフォーム(Windowsとか)でちゃんと動くかどうかは
|かなり怪しいと思います。

コミットしたら誰かが直すでしょう、きっと。

うささん、ごめんなさい。

--
Shugo Maeda

=end

#7 Updated by Shugo Maeda over 6 years ago

=begin
前田です。

2008/08/18 14:25 Yukihiro Matsumoto matz@ruby-lang.org:

|> では、BROKENでない単語を使って(NOGMTOFFとか)コミットしていた
|> だけませんか > 前田さん
|
|NOGMTOFFは何か違うような気がします。

そうですか。

tm_gmtoffがあるかどうかと、strftimeがtest_time.rbが期待する挙動を示すかどうかが、
同じ条件なのかどうかに確信が持てなかったのでした。

|といって、STRFTIME_Z_DOESNT_RETURN_GMTくらいしか思い付かなかったのですが、
|他によい名前はないでしょうか。

いっそ、全部自前のmissing/strftime.cを使うというのでどうでしょ
う。将来のことを考えると結局はこっちが道かも。

方向性としては賛成なのですが、1.9.1までにやります?

--
Shugo Maeda

=end

#8 Updated by Yukihiro Matsumoto over 6 years ago

=begin
まつもと ゆきひろです

In message "Re: Re: [Bug #437] test_strftime(TestTime) fails on Solaris"
on Wed, 20 Aug 2008 23:24:47 +0900, "Shugo Maeda" shugo@ruby-lang.org writes:

|2008/08/18 14:34 Shugo Maeda shugo@ruby-lang.org:
|>> いっそ、全部自前のmissing/strftime.cを使うというのでどうでしょ
|>> う。将来のことを考えると結局はこっちが道かも。
|>
|> 方向性としては賛成なのですが、1.9.1までにやります?
|
|とりあえず、作業してみました。パッチを添付します。

コミットしてください。

|i686-linux/i386-solaris2.10で確認したかぎりではtest_time.rbも
|通るようになりました。
|ただ、他のプラットフォーム(Windowsとか)でちゃんと動くかどうかは
|かなり怪しいと思います。

コミットしたら誰かが直すでしょう、きっと。

|あと、%L(millisecond)/%N(nanosecond)もついでに実装しました。

おお。

=end

#9 Updated by Yukihiro Matsumoto over 6 years ago

=begin
まつもと ゆきひろです

In message "Re: Re: [Bug #437] test_strftime(TestTime) fails on Solaris"
on Mon, 18 Aug 2008 14:19:16 +0900, "Shugo Maeda" shugo@ruby-lang.org writes:

|> では、BROKENでない単語を使って(NOGMTOFFとか)コミットしていた
|> だけませんか > 前田さん
|
|NOGMTOFFは何か違うような気がします。

そうですか。

|といって、STRFTIME_Z_DOESNT_RETURN_GMTくらいしか思い付かなかったのですが、
|他によい名前はないでしょうか。

いっそ、全部自前のmissing/strftime.cを使うというのでどうでしょ
う。将来のことを考えると結局はこっちが道かも。

=end

#10 Updated by Yukihiro Matsumoto over 6 years ago

=begin
まつもと ゆきひろです

In message "Re: Re: [Bug #437] test_strftime(TestTime) fails on Solaris"
on Thu, 21 Aug 2008 01:13:43 +0900, "Shugo Maeda" shugo@ruby-lang.org writes:

|Time.now.utc.strftime("%Z")は今は"GMT"を返すようにしてあるんですけど、
|"UTC"を返すようにした方がいいんですかねえ。

そうですね。いまさらGMTもないでしょうから。

=end

#11 Updated by Shugo Maeda over 6 years ago

=begin
前田です。

At Thu, 21 Aug 2008 03:43:32 +0900,
Tanaka Akira akr@fsij.org wrote:

| The fractional seconds digits. Default is 9 digits (nanoseconds).
|
| %3N milliseconds (3 digits)
| %6N microseconds (6 digits)
| %9N nanoseconds (9 digits)

%L がいけないというほどではありませんが、桁数ごとに記号を消
費するよりは、Perl のように桁数指定を許したほうが良いのでは
ないでしょうか。

なるほど、ではその方向で修正します。
%Lは廃止した方がいいですかね。

--
Shugo Maeda shugo@ruby-lang.org

=end

#12 Updated by Shugo Maeda over 6 years ago

=begin
前田です。

2008/08/15 21:29 Tanaka Akira akr@fsij.org:

簡単な解決としては、添付のパッチのような方法しか思い付きませんでし
たが、もっと上手い解決方法があれば教えてください。

ほんとは全部自前で実装するのがよいのでしょうが…。

missing/strftime.c を常に使うという話ですかね。

まぁ、%Z だけでなく %N やロケールの話もありますし。

そうですね。その方が安心して使えると思います。

missing/strftime.cには何か足りないのでしたっけ。
あと、%Zのために、tm構造体ではなくtime_object構造体を受け取る
ようなAPIにした方がいい気がしますね。

--
Shugo Maeda

=end

#13 Updated by Shugo Maeda over 6 years ago

=begin
前田です。

At Thu, 21 Aug 2008 06:20:54 +0900,
Yukihiro Matsumoto matz@ruby-lang.org wrote:

|Time.now.utc.strftime("%Z")は今は"GMT"を返すようにしてあるんですけど、
|"UTC"を返すようにした方がいいんですかねえ。

そうですね。いまさらGMTもないでしょうから。

そのように修正しておきました。

--
Shugo Maeda shugo@ruby-lang.org

=end

#14 Updated by Shugo Maeda over 6 years ago

=begin
前田です。

2008/08/21 0:49 U.Nakamura usa@garbagecollect.jp:

うささん、ごめんなさい。

お察しの通りなので、適当にコンパイルが通るように直しました。

ありがとうございました。
あとは、「東京標準時」問題を…。

Time#{to_s,zone}でもstrftime(3)を使用しないようにして、missing/strftime.c
は削除しました。

Time.now.utc.strftime("%Z")は今は"GMT"を返すようにしてあるんですけど、
"UTC"を返すようにした方がいいんですかねえ。

--
Shugo Maeda

=end

#15 Updated by Usaku NAKAMURA over 6 years ago

=begin
こんにちは、なかむら(う)です。

In message " Re: [Bug #437] test_strftime(TestTime) fails on Solaris"
on Aug.21,2008 00:32:53, shugo@ruby-lang.org wrote:

|i686-linux/i386-solaris2.10で確認したかぎりではtest_time.rbも
|通るようになりました。
|ただ、他のプラットフォーム(Windowsとか)でちゃんと動くかどうかは
|かなり怪しいと思います。

コミットしたら誰かが直すでしょう、きっと。

うささん、ごめんなさい。

お察しの通りなので、適当にコンパイルが通るように直しました。
いちおう、i386-netbsdelfでも、私の変更前後でtest_time.rbの結
果が変わらない(0F0E)ことを確認はしましたが、他のプラットフォ
ームで何か問題があったら誰か直してください :)

それでは。
--
U.Nakamura usa@garbagecollect.jp

=end

#16 Updated by Shugo Maeda over 6 years ago

=begin
前田です。

2008/08/18 14:34 Shugo Maeda shugo@ruby-lang.org:

いっそ、全部自前のmissing/strftime.cを使うというのでどうでしょ
う。将来のことを考えると結局はこっちが道かも。

方向性としては賛成なのですが、1.9.1までにやります?

とりあえず、作業してみました。パッチを添付します。

i686-linux/i386-solaris2.10で確認したかぎりではtest_time.rbも
通るようになりました。
ただ、他のプラットフォーム(Windowsとか)でちゃんと動くかどうかは
かなり怪しいと思います。

あと、%L(millisecond)/%N(nanosecond)もついでに実装しました。

--
Shugo Maeda

Attachment: strftime.diff
=end

#17 Updated by Shugo Maeda over 6 years ago

=begin
前田です。

2008/08/15 21:08 Yukihiro Matsumoto matz@ruby-lang.org:

|ということで、
|
|> +#ifdef BROKEN_STRFTIME_Z
|
|「BROKEN」ではなく仕様ですね。

では、BROKENでない単語を使って(NOGMTOFFとか)コミットしていた
だけませんか > 前田さん

NOGMTOFFは何か違うような気がします。
といって、STRFTIME_Z_DOESNT_RETURN_GMTくらいしか思い付かなかったのですが、
他によい名前はないでしょうか。

--
Shugo Maeda

=end

#18 Updated by Yui NARUSE over 6 years ago

  • Assignee set to Yusuke Endoh

=begin
すでに直ってる気がするので、確認よろしくお願いします(ぉ
=end

#19 Updated by Shugo Maeda over 6 years ago

  • Status changed from Open to Closed
  • Assignee changed from Yusuke Endoh to Shugo Maeda

=begin
すみません、closeしわすれていました。
=end

Also available in: Atom PDF