Project

General

Profile

Actions

Bug #437

closed

test_strftime(TestTime) fails on Solaris

Added by shugo (Shugo Maeda) over 15 years ago. Updated almost 13 years ago.

Status:
Closed
Target version:
-
ruby -v:
Backport:
[ruby-dev:35845]

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

Actions #1

Updated by shugo (Shugo Maeda) over 15 years ago

=begin
前田です。

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

2008/08/13 23:27 Shugo Maeda :

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

Actions #2

Updated by matz (Yukihiro Matsumoto) over 15 years ago

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

In message "Re: [ruby-dev:35856] Re: [Bug #437] test_strftime(TestTime) fails on Solaris"
on Fri, 15 Aug 2008 17:21:34 +0900, SATOH Fumiyasu 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

Actions #3

Updated by mame (Yusuke Endoh) over 15 years ago

=begin
遠藤です。

2008/08/15 17:21 SATOH Fumiyasu :

+#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

=end

Actions #4

Updated by mame (Yusuke Endoh) over 15 years ago

=begin
遠藤です。

2008/08/16 2:43 SATOH Fumiyasu :

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

=end

Actions #5

Updated by mame (Yusuke Endoh) over 15 years ago

=begin
遠藤です。

2008/08/16 3:27 Yusuke ENDOH :

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

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

--
Yusuke ENDOH

=end

Actions #6

Updated by shugo (Shugo Maeda) over 15 years ago

=begin
前田です。

2008/08/20 23:46 Yukihiro Matsumoto :

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

コミットしてください。

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

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

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

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

--
Shugo Maeda

=end

Actions #7

Updated by shugo (Shugo Maeda) over 15 years ago

=begin
前田です。

2008/08/18 14:25 Yukihiro Matsumoto :

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

そうですか。

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

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

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

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

--
Shugo Maeda

=end

Actions #8

Updated by matz (Yukihiro Matsumoto) over 15 years ago

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

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

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

コミットしてください。

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

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

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

おお。

=end

Actions #9

Updated by matz (Yukihiro Matsumoto) over 15 years ago

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

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

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

そうですか。

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

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

=end

Actions #10

Updated by matz (Yukihiro Matsumoto) over 15 years ago

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

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

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

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

=end

Actions #11

Updated by shugo (Shugo Maeda) over 15 years ago

=begin
前田です。

At Thu, 21 Aug 2008 03:43:32 +0900,
Tanaka Akira 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

=end

Actions #12

Updated by shugo (Shugo Maeda) over 15 years ago

=begin
前田です。

2008/08/15 21:29 Tanaka Akira :

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

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

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

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

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

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

--
Shugo Maeda

=end

Actions #13

Updated by shugo (Shugo Maeda) over 15 years ago

=begin
前田です。

At Thu, 21 Aug 2008 06:20:54 +0900,
Yukihiro Matsumoto wrote:

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

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

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

--
Shugo Maeda

=end

Actions #14

Updated by shugo (Shugo Maeda) over 15 years ago

=begin
前田です。

2008/08/21 0:49 U.Nakamura :

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

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

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

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

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

--
Shugo Maeda

=end

Actions #15

Updated by usa (Usaku NAKAMURA) over 15 years ago

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

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

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

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

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

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

それでは。

U.Nakamura

=end

Actions #16

Updated by shugo (Shugo Maeda) over 15 years ago

=begin
前田です。

2008/08/18 14:34 Shugo Maeda :

いっそ、全部自前の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

Actions #17

Updated by shugo (Shugo Maeda) over 15 years ago

=begin
前田です。

2008/08/15 21:08 Yukihiro Matsumoto :

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

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

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

--
Shugo Maeda

=end

Actions #18

Updated by naruse (Yui NARUSE) over 15 years ago

  • Assignee set to mame (Yusuke Endoh)

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

Actions #19

Updated by shugo (Shugo Maeda) over 15 years ago

  • Status changed from Open to Closed
  • Assignee changed from mame (Yusuke Endoh) to shugo (Shugo Maeda)

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

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0