okuの日記: うるう年 @ GNU date(1) 6
$ 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」で閉じた模様です。 まあ、それが無難でしょうね。
OS Xの場合 (スコア:1)
通りすがりです。どのような出力であればokuさんが微妙に思わないのか書かれていていないので、比較の対象になるのか、お役に立つのかわかりませんがOS Xの場合です。+1yearのように洒落たことができませんので秒数で増減させてみます。man date [apple.com]。
Linux箱にバージョン違いがあったので一緒に載せておきます。6.10と一緒ですね。
Re:OS Xの場合 (スコア:1)
-- Takehiro TOMINAGA // may the source be with you!
賢いのか微妙なのか微妙 (スコア:1)
こんにちはttさん。これなら縮退しませんよ :)
# 予想外の賢い結果にビックリRe:賢いのか微妙なのか微妙 (スコア:1)
-- Takehiro TOMINAGA // may the source be with you!
桑原桑原 (スコア:1)
ええそうなんですよ。私なら気がするどころか、絶対にハマリますね。閏日を跨ぐときはもとより閏年、ひいては日付計算は要注意ってことで。
Re:OS Xの場合 (スコア:1)
既にお二人とも収束しておられるようですが、元ネタは java.util.GregorianCalendar の bug [sun.com] です。 評価欄によれば、
職場では「バグ」として報じられたのですが、自分的には「そりゃ『翌年の今日』の定義によるんじゃないの?」と思って、取り敢えず近場にあった GNU date(1) を試してみたところ... というわけです。 :-)
ちなみに FreeBSD (≒OS X) の date なら「-v +1y」で同じことができるのではないでしょうか。