【Mac】カウントダウンを表示

今年はいろいろとイベントがあるので、GeekTool でカウントダウンを表示したくなった。

カウントダウンのシェルスクリプト

シェルスクリプトの基本的なことは以下の通り。

🔗 【Mac】シェルスクリプトの使い方 | 林檎コンピュータ

📝 countdown.sh
#!/bin/sh

function keisan() {
	Time=$1

	fun=`echo $((Time/60))`
	byo=`echo $((Time%60))`

	if test $fun -ge 60; then
		ji=`echo $((fun/60))`
		fun2=`echo $((fun%60))`
		if test $ji -ge 24; then
			nichi=`echo $((ji/24))`
			ji2=`echo $((ji%24))`
			echo "${nichi}"'日'"${ji2}"'時間'
		else
			echo "${ji}"'時間'"${fun2}"'分'
		fi
	else
		echo "${fun}"'分'"${byo}"'秒'
	fi	
}

if test -z "$1"; then
	exit 0
else
	jikoku=$1
fi

if [[ "$jikoku" =~ ^[0-9]+$ ]]; then #引数が数字かどうか
	keta=`echo ${#jikoku}` #桁数を調べる
else
	exit 0
fi

if test "$keta" -eq 8; then #時刻は省略可能
	jikoku=`echo "$jikoku"'000000'`
	keta=14
fi

if test "$keta" -eq 14; then
	target=`date -j -f "%Y%m%d%H%M%S" "$jikoku" "+%s"`
	now=`date +%s`
	Time=`echo $((target - now))`
	if test "$Time" -ge 0; then
		keisan "$Time"
	else
		echo '終了' #目標の時間を過ぎたら終了
		exit 0
	fi
else
	exit 0
fi

これを GeekTool で 60 秒に一度実行することにした。
 GeekTool については以下の記事で基本的なことを書いた。

🔗 【Mac】現在の気温をデスクトップに | 林檎コンピュータ

コマンドは以下のようにした。

echo '御代替わりまであと'`~/スクリプトの場所/countdown.sh 20190501000000`

「スクリプトの場所」は書き換えが必要だ。

時刻のフォーマットは西暦が 4 桁、他は 2 桁。時間は 24 時間表記で、14 桁になるように指定する。ちなみに、

if [[ "$jikoku" =~ ^[0-9]+$ ]]; then
	keta=`echo ${#jikoku}`
fi

の、[[ "$jikoku" =~ ^[0-9]+$ ]] は入力されたものが数字か、そうではないかを調べている。
echo ${#jikoku}は文字数を返す変数展開だ。

UNIX Time

カウントダウンなんて簡単だろうと思ったら、これが大変だった。
「未来の時間 – 現在の時間」をどうやればいいんだろうか、と悩んでしまった。
 しかし UNIX Time というものを知って、やっと見通しがついた。

誰のアイディアか知らないが、UNIX Time というのがあるのだ。1970 年元旦 0 時 0 分 0 秒からずっと、一秒に 1 ずつ加算されていく数字、というものがあるのだ。
 1970 年元日 0 時 0 分 0 秒の UNIX Time は 0 である(UTC)。
 同日 0 時 0 分 1 秒の UNIX Time は 1 である。
 これが、翌日 1 月 2日の 0 時 0 分 0 秒になると、もう 86400 だ。
 翌日の同じ時間では 172800。
 つまり毎日 86400 ずつ増えていく。それが UNIX Time だ。怖い、というべきではないだろうか。ドラえもんにバイバインという有名なエピソードがあるが、それを思い出す。

約 49 年たった今、どうなってしまっているのか。確認するのは簡単だ。date コマンドに「+%s」というフォーマットをつけると表示される。以下は日本時間である。

現在の UNIX Time を取得
$ date "+%s"⏎
1549019079

思ったより増えていない気がして、ひと安心だ。
 過去や未来の UNIX Time を取得するなら、以下のようにフォーマットを定めて指定する。

過去や未来の UNIX Time を取得
$ date -j -f "%Y-%m-%d %H:%M:%S" "2019-05-01 00:00:00" "+%s"⏎
1556636400

つまり、

「未来のUNIXTime」 – 「現在のUNIXTime」 = 「残り時間の秒数」

ということになる。十進法の簡単な引き算やら足し算で時間を扱えるのである。
 ちなみに、UNIX Time を時刻表記に戻すのも簡単だ。

UNIX Time を一般の時刻に戻す
$ date -r 1556636400⏎
2019年 5月 1日 水曜日 00時00分00秒 JST