パスワードを忘れた? アカウント作成
416291 journal

okuの日記: うるう年 @ GNU date(1) 6

日記 by oku

$ date '+%x' -d '2008-02-29 +1year'
2009年03月01日
$ date '+%x' -d '2008-02-29 -1year'
2007年03月01日
$ date '+%x' -d '2008-03-01 +1year'
2009年03月01日
$ date '+%x' -d '2008-03-01 -1year'
2007年03月01日
$

バグとまでは言えないけれど、かなり微妙な出力ではないかと思います。

ちなみにバージョンは以下の通り:

$ date --version
date (GNU coreutils) 6.10
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

作者 David MacKenzie.

2008-02-25 追記:

$ date '+%x' -d '2008-03-31 -1 month'
2008年03月02日
$ date '+%x' -d '2007-03-31 -1 month'
2007年03月03日
$ date '+%x' -d '2007-12-31 -1 month'
2007年12月01日
$

前月の日数を引き算している... のかな? まあこれはこれで首尾一貫していると言えなくもないような気がします。

ところで、元ネタのバグは「won't fix」で閉じた模様です。 まあ、それが無難でしょうね。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by SOggy (10951) on 2008年02月18日 4時13分 (#1298829) 日記

    通りすがりです。どのような出力であればokuさんが微妙に思わないのか書かれていていないので、比較の対象になるのか、お役に立つのかわかりませんがOS Xの場合です。+1yearのように洒落たことができませんので秒数で増減させてみます。man date [apple.com]。

    $ date -ur 1204243200                              #2/29はエポックから1204243200秒
    Fri Feb 29 00:00:00 UTC 2008
    $ date -ur $((1204243200+60*60*24*365))            #一年後
    Sat Feb 28 00:00:00 UTC 2009
    $ date -ur $((1204243200-60*60*24*365))            #一年前
    Thu Mar  1 00:00:00 UTC 2007
    $ date -ur $((1204243200+60*60*24*1+60*60*24*365)) #一日足して一年後
    Sun Mar  1 00:00:00 UTC 2009
    $ date -ur $((1204243200+60*60*24*1-60*60*24*365)) #一日足して一年前
    Fri Mar  2 00:00:00 UTC 2007

    Linux箱にバージョン違いがあったので一緒に載せておきます。6.10と一緒ですね。

    $ date --version
    date (coreutils) 5.2.1
    Written by David MacKenzie.

    Copyright (C) 2004 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    $ date '+%x' -d '2008-02-29 +1year'
    03/01/09
    $ date '+%x' -d '2008-02-29 -1year'
    03/01/07
    $ date '+%x' -d '2008-03-01 +1year'
    03/01/09
    $ date '+%x' -d '2008-03-01 -1year'
    03/01/07
    • by tt (2867) on 2008年02月19日 3時16分 (#1299514) 日記
      ご本人ではないですが、私は「一年後の一年前」が今日にならない(一年後が縮退(?)している)のが微妙というか違和感というか、ちょっとハマリの匂いを感じました。
      --
      -- Takehiro TOMINAGA // may the source be with you!
      親コメント
    • by oku (4610) on 2008年02月20日 11時06分 (#1300183) 日記

      既にお二人とも収束しておられるようですが、元ネタは java.util.GregorianCalendar の bug [sun.com] です。 評価欄によれば、

      Staying in February for the case makes sense. In fact, add() behaves differently.

      However, roll() is working that way since JDK1.1. The behavior change might break existing applications.
      xxxxx@xxxxx 2004-03-17

      2月に収まる方が理に適っているだろう。 実際、add() の振舞いは違う。

      しかしながら、roll() は JDK1.1 からこのように動作している。 この振舞いを変更すると既存のアプリケーションに影響が出るかも知れない。
      xxxxx@xxxxx 2004-03-17

      職場では「バグ」として報じられたのですが、自分的には「そりゃ『翌年の今日』の定義によるんじゃないの?」と思って、取り敢えず近場にあった GNU date(1) を試してみたところ... というわけです。 :-)

      ちなみに FreeBSD (≒OS X) の date なら「-v +1y」で同じことができるのではないでしょうか。

      親コメント
typodupeerror

私はプログラマです。1040 formに私の職業としてそう書いています -- Ken Thompson

読み込み中...