晩飯くってまったりしている頃にIRCを見ると次のような会話が。
22:44 <yaegashi> unix time からふつうの時刻表記に直すのはどうやる
22:44 <yaegashi> irb とかつかわずに
22:45 >ukai< % ruby -rtime -e 'puts Time.at(1234567)'
22:46 <yaegashi> いやだから ruby とかつかわんで(わら
22:46 <ar-m> dateコマンドで
22:46 <yaegashi> date(1) でなんとかできんのかな
22:46 <ar-m> できそうなもんだけどな
そうだなあ と思い、ちょっと調べてみることにした。
出力する方は
date +%sだけど逆はないものか。
まず何も考えずに
% date -d "$(date +%s)"
date: invalid date `1223478096'
で駄目。
date(1)を見てもちゃんと書いてない。
オプション
-d datestr, --date datestr 現 在の時刻・日付の代わりに、 datestr で指定された時刻・日付を表 示する。 datestr は普通のフォーマットならだいたいなんでも使う こ とができる。月名、タイムゾーン、`am' や `pm' なども用いてよい。
man -L C date しても特に情報はなさげ。
そういう時はやっぱりソースを見るのが早いかなと思うが、ソースとってきて展開するも面倒だなあと。(まあ apt-get source coreutils でいいんだけど)
というか、こういう時こそ
www.google.com/codesearchではないかと思い出し、早速検索。
dateコマンドはcoreutilsパッケージの中にあったよなということで、まずは
date.c coreutilsで検索。最初の候補は
man/Makefile.am。manじゃないので
..へ移動してみて、
srcに移動。
すると
date.cがあるのでそれを見てみる。ざっと見ていくと
335 switch (optc)
336 {
337 case 'd':
338 datestr = optarg;
339 break;
とあるので
datestrをたどっていき
option_specified_date = trueで
reference = NULLなので
494 /* (option_specified_date || set_date) */
495 if (reference != NULL)
496 {
497 if (stat (reference, &refstats) != 0)
498 error (EXIT_FAILURE, errno, "%s", reference);
499 when = get_stat_mtime (&refstats);
500 }
501 else
502 {
503 if (set_datestr)
504 datestr = set_datestr;
505 valid_date = get_date (&when, datestr, NULL);
506 }
に辿りつく。
get_dateは
date.cにはなさそうなので
coreutils-6.6.tar.bz2で
get_dateを検索すると
getdate.cが見つかる。が、これbisonで生成されたコードなので、元の
getdate.yの方をみてみる。
ざっと見ると
238 spec:
239 timespec
240 | items
241 ;
242
243 timespec:
244 '@' seconds
245 {
246 pc->seconds = $2;
247 pc->timespec_seen = true;
248 }
249 ;
を発見。どうやら
@を数字の前につければよいらしい。
というわけで試してみる。
% date -d "@$(date +%s)"
2008年 10月 8日 水曜日 22:54:21 JST
% LANG=C date -d "@$(date +%s)"
Wed Oct 8 22:54:21 JST 2008
結局manとか読んだりいろいろ試したりするのに5分少々、codesearchしはじめてからここまでは3分少々なかんじ。ということで報告
22:55 >ukai< わかった
22:55 >ukai< date -d "@$(date +%s)"
22:55 >ukai< @ をつけるべし
22:59 <yaegashi> @ てなんだ
22:59 <yaegashi> きいてないぞ
23:00 <yaegashi> どういうことだ
そういやinfoを見てなかったなあ と思って
info dateを見ると書いてあるね。
File: coreutils.info, Node: Seconds since the Epoch, Next: Specifying time zone rules, Prev: Pure numbers in date strings, Up: Date input formats
27.8 Seconds since the Epoch
============================
If you precede a number with `@', it represents an internal time stampas a count of seconds. The number can contain an internal decimalpoint (either `.' or `,'); any excess precision not supported by theinternal representation is truncated toward minus infinity. Such anumber cannot be combined with any other date item, as it specifies acomplete time stamp.
まとめ