UNIXタイムスタンプがあり、そのタイムスタンプに対応するフォーマットされた日付(date
の出力など)を取得したいと考えています。
これまでの私の試み:
$ date +%s
1282367908
$ date -d 1282367908
date: invalid date `1282367908'
$ date -d +1282367908
date: invalid date `+1282367908'
$ date +%s -d +1282367908
date: invalid date `+1282367908'
次のような出力を取得できるようにしたいと思います。
$ TZ=UTC somecommand 1282368345
Sat Aug 21 05:25:45 UTC 2010
Mac OS XおよびBSDの場合:
$ date -r 1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -r 1282368345 +%Y-%m-%d
2010-08-21
GNUコアツールを使用する(そのための情報ファイルを掘り下げる必要があります):
$ date -d @1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -d @1282368345 --rfc-3339=date
2010-08-21
どちらかを使用して、-u
(標準)オプションを追加するか、TZ=UTC0
環境変数を渡してUTC日付(TZ=UTC0
definesオフセット付きのUTC
と呼ばれるタイムゾーン)を指定しますTZ=UTC
(オフセットなし)の動作が指定されていない間、UTCから0(ほとんどのシステムでは、UTC
とも呼ばれるシステム定義のタイムゾーンを参照し、UTCからのオフセット0)))。
このPerlワンライナーはそれを行います:
$ Perl -e 'print scalar localtime $ARGV[0]' 1282367908
Sat Aug 21 09:18:28 2010
いくつかグーグルした後、date
コマンドのみでそれを行う方法を見つけました。
$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds"
Sat Aug 21 09:18:28 MSD 2010
Shellビルトインの場合:
zsh
(4.1.1(2003)以降):
_$ zmodload zsh/datetime
$ TZ=UTC0 strftime %c 1282368345
Sat 21 Aug 2010 05:25:45 UTC
_
_ksh93
_(_ksh93i
_(2000)以上):
_$ TZ=UTC0 printf '%(%c)T\n' '#1282368345'
Sat Aug 21 05:25:45 2010
_
bash
(4.2(2010)以降):
_$ TZ=UTC0 printf '%(%c)T\n' 1282368345
Sat 21 Aug 2010 05:25:45 UTC
_
これらすべてにおいて、_%c
_を必要なstrftime()
形式に置き換えます。
古い質問への回答ですが、他の誰かがこれを検索した場合、これは改善になると思います。このBash機能はLinuxとOS Xの両方で機能します。他のBSDシステムではテストしていません。この関数の引数としてエポック時間を渡すと、RFC-3339時間形式が出力されます。
epochtorfc3339 ()
{
RFC3339_FORMAT="+%FT%T:::%z"
Epoch=$(echo $@ | sed -n "s/.*\([0-9]\{10\}\).*/\1/p");
if date --version >/dev/null 2>/dev/null; then
# Linux
date ${RFC3339_FORMAT} -d "1970-01-01 UTC ${Epoch} seconds"
#date -d @${Epoch} --rfc-3339=seconds
else
# OS X/BSD
date -r ${Epoch} ${RFC3339_FORMAT}
fi
}
OSXでは、UTCで
date -r "1475737200" -u
現代のUnixの豊かな遺産のもう1つのきちんとした例。これは、ほとんどのBSDバリアントで実際に可能です。
$ TZ=UTC date -r 1282368345
Sat Aug 21 05:25:45 UTC 2010
(ところであなたの例は1秒ずれているようです)