晩飯くってまったりしている頃に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.
まとめ
一番下の、
ReplyDelete「www.google.com/codesearchで検索するのが楽」
のリンク先が
「http://www.google.coom/codesearch」
になっています。
うお、確かに。
ReplyDelete直しました。