「このUNIXタイムスタンプいつ?」をサクッと解決!Mac開発者のための快適設定
こんにちは。思い立ったらすぐ効率化したいこうじです。
最近Laravel製プロジェクトでこういうことがあるんです。
定期的にJobがちゃんと動いてるか確認する際にJobsテーブルを確認するんですが、その際にいっつもこれ、思うんです。
決して頻度が多いわけではないんですが、滅多にやらないわけでもない微妙な立ち位置のUNIXタイムスタンプ。
今回はこれを自分用に使いやすく使えるようにしていきたいと思います!
今までの解決方法
今までは、「そんな毎回じゃないし、都度調べるかな。」なんてそんな選択肢すら考える以前の問題で、実際にその場になった時に「ああ!いつだこれ。めんどくせー。」と言いながら重い腰を上げて調べるといった感じです(笑)
そして今の解決方法はこんな感じ
素直にAIに聞く
最近はAIに聞くのが手っ取り早いです。ちょっときつい言い方ですが根は優しいので教えてくれます。
ありがたいツールを使う
一昔前だったら「UNIX タイムスタンプ 変換」とかやったら、同じような悩みを持っている人が作ったありがたいツールが公開されてたりするので、それを使わせていただいたりしておりました。
とはいえ、いずれにしても一手間ではあるんですよね。
せっかくだから自作しようぜ!
何が手間かってブラウザ開くのもAIに聞くのも何回かトラックパッドをポチポチして画面に移動してからカタカタしないといけないのが面倒!
なので、自分が使いやすいように今後の為に自作することにしました!
シンプルにするために、とりあえず目の前の意味不明数値を日付でわかりやすく見れるのを目標にし、それ以外全部エラーにします。
自作コマンドでサクッと解決
自作コマンドのいいところはターミナルを立ち上げてササッとコマンド実行できるのがとっても便利!
僕は結構いろんな用途でショートカット作ってラクさせてもらってます。
その一端に今回のタイムスタンプ変換もつっこんでしまいます!
.zshrc(.bashrc)を開く
ターミナルを起動したらホームに移動して.zshrc(古い環境だと.bashrcかも)を開いてください。
vim ~/.zshrc
コマンドを追加
開いたら以下の行を追加してください。
実際の処理はPythonを使用します。Macなら使用するライブラリも標準のものしか使用していないので、特に何かをインストールする必要はありません。
# UNIXタイムスタンプを見やすいフォーマットで表示
alias ts='python3 -c "import datetime, sys; print(datetime.datetime.fromtimestamp(int(sys.argv[1])).strftime(\"%Y-%m-%d %H:%M:%S\"))"'
やっていることは
引数で受け取ったUNIXタイムスタンプ数値を
%Y-%m-%d %H:%M:%S(年-月-日 時:分:秒)に変換して表示(
print())しろ!
これだけです。めっちゃ簡単!
追加後は保存して閉じます。保存は:wqと入力すれば保存して閉じます。
反映してテスト
保存が終わったら、反映しないとコマンドが使用可能になりませんので、以下のコマンドで反映してください。
source ~/.zshrc
保存が終わったら以下のコマンドを入力してみてください。
ts 1778198400
# こんな感じで出力される!
2026-05-08 09:00:00
Python3が入っていない場合
古いOSの時はPython2が標準インストールされていましたが、最近のmacOSは標準でPythonがプリインストールされていません。
ターミナルでpython3 --versionと入力してエラーになる場合は、Pythonをインストールする必要があります。
導入方法は多々ありますが、参考までにインストール方法の一例をご紹介します。
コマンドラインツールで入れる(バージョンによる)
ターミナルでpython3と打つと「インストールしますか?」という案内が出るので、そのままインストール。Homebrewで入れる(エンジニア向け)
brew install pythonを実行。
ミリ秒にも対応させる
あーほらほら。みんなJavaScript好きでしょ?JavaScriptの場合は、時間比較する時ってミリ秒でどっちが先かとかこれから時間出したりとかよくしますよね。
なので、せっかくなのでミリ秒も対応させてみましょう!
先ほどのコマンドを変更
先ほど入力してもらったコマンドを以下のように変更します。
# 10桁(秒)でも13桁(ミリ秒)でも自動判定
alias ts='python3 -c "import datetime, sys; t=int(sys.argv[1]); ts=t/1000 if len(str(abs(t)))==13 else t; print(datetime.datetime.fromtimestamp(ts).strftime(\"%Y-%m-%d %H:%M:%S\"))"'
コマンドは全く一緒で、UNIXタイムスタンプ(10桁)か、ミリ秒(13桁)かを処理側で勝手に判別してよしなにやってくれます。
こちらは何も考えずにtsコマンドの後に数値をコピペするだけ!
source ~/.zshrc
# 設定を反映
source ~/.zshrc
# コマンドを実行
ts 1778198400000
# こんな感じで出力される!
2026-05-08 09:00:00
これで、どちらで投げても日付をもらえるようになりました!
まぁ、0が多いか少ないかの違いなんですけどね(笑)。ただ何も考えずにコピペで投げられるのは助かりますよね!きっとそう!
逆バージョンも実装してみる
ここまでくるとみんな思うんじゃないですか?日付フォーマットからタイムスタンプ出せないの?って。
まぁ、使い道あるかどうか微妙ですけど(笑)。
ただせっかくなんで、「2026-12-30 09:00:00」みたいな感じで日付を渡したら、タイムスタンプを受け取れる機能も追加してみましょう!
先ほどのコマンドを変更
先ほど変更したコマンドを以下のように変更します。
エイリアス(alias)だとスペースを含む文字列の処理が厳しいので、今回は関数(function)として書き換えます。
# 日時 <-> タイムスタンプを相互変換
ts() {
python3 -c "
import sys, datetime
# 引数をすべて結合して前後のスペースを削除
arg = ' '.join(sys.argv[1:]).strip()
try:
if not arg:
dt = datetime.datetime.now()
elif arg.isdigit() or (arg.startswith('-') and arg[1:].isdigit()):
t = int(arg)
# abs(t)で符号を無視して桁数判定に統一
ts_val = t / 1000 if len(str(abs(t))) == 13 else t
dt = datetime.datetime.fromtimestamp(ts_val)
else:
# 複数の日付フォーマットを寛容にパース
formats = ['%Y-%m-%d %H:%M:%S', '%Y-%m-%d', '%Y/%m/%d %H:%M:%S', '%Y/%m/%d']
for fmt in formats:
try:
dt = datetime.datetime.strptime(arg, fmt)
break
except ValueError:
pass
else:
raise ValueError('Invalid date format')
ts_sec = dt.timestamp()
dt_utc = datetime.datetime.fromtimestamp(ts_sec, datetime.timezone.utc)
print(f'Datetime (Local): {dt.strftime(\"%Y-%m-%d %H:%M:%S\")}')
print(f'Datetime (UTC): {dt_utc.strftime(\"%Y-%m-%d %H:%M:%S\")}')
print(f'Unix (s): {int(ts_sec)}')
print(f'JS (ms): {int(ts_sec * 1000)}')
except Exception as e:
print('Usage: ts [timestamp] or ts \"YYYY-MM-DD HH:MM:SS\"')
" "$@"
}
設定を反映してコマンドを実行します。
# 設定を反映
source ~/.zshrc
# 日付からタイムスタンプへ(ハイフンでもスラッシュでも、時間なしでもOK!)
# ts 2026/05/08 <= OK!
# ts 2026-05-08 <= OK!
ts 2026/05/08 00:00:00
# こんな感じで親切に出力される!
Datetime (Local): 2026-05-08 00:00:00
Datetime (UTC): 2026-05-07 15:00:00
Unix (s): 1778166000
JS (ms): 1778166000000
これで、両対応の全盛りコマンドが完成しました!
さらに楽したい?「右クリック」で通知を出してみる
ここまできたらサクッと知るための一番楽な方法はターミナルを開くよりも文字を選択して右クリックからの変換が一番じゃないでしょうか!
なので、最後に「Automator」を使用して、右クリック対応もしてみたいと思います!
Automatorを開く
まずは⌘ + スペースを押してSpotlightを開きます。
Spotlightを開き、「Automator」と入力すると候補に出るので選択してください。
クイックアクションを作成
スクリプトを貼り付け
シェルスクリプトのブロックを追加するとその箇所に入力ができるようになるので以下のコマンドを貼り付けてください。
INPUT=$1
# Homebrew等の環境変数を考慮し、python3のパスはフルパス記述が安全です
# 動かない場合はターミナルで which python3 を叩いて出たパスに書き換えてください
# 例: PYTHON_PATH="/opt/homebrew/bin/python3"
PYTHON_PATH="python3"
RESULT=$($PYTHON_PATH -c "
import sys, datetime
arg = sys.argv[1].strip()
try:
if arg.isdigit() or (arg.startswith('-') and arg[1:].isdigit()):
t = int(arg)
ts_val = t / 1000 if len(str(abs(t))) == 13 else t
dt = datetime.datetime.fromtimestamp(ts_val)
print(f'Datetime: {dt.strftime(\"%Y-%m-%d %H:%M:%S\")}')
else:
# よくある日付フォーマット
formats = ['%Y-%m-%d %H:%M:%S', '%Y-%m-%d', '%Y/%m/%d %H:%M:%S', '%Y/%m/%d']
for fmt in formats:
try:
dt = datetime.datetime.strptime(arg, fmt)
break
except ValueError:
pass
else:
raise ValueError()
ts_sec = int(dt.timestamp())
print(f'Unix(s): {ts_sec}\nJS(ms): {ts_sec * 1000}')
except:
print('Error')
" "$INPUT")
# 結果の判定と通知
if [ "$RESULT" != "Error" ] && [ -n "$RESULT" ]; then
osascript -e "on run argv" \
-e "display notification (item 1 of argv) with title \"タイムスタンプ相互変換\"" \
-e "end run" "$RESULT"
else
osascript -e "display notification \"数値または対応する日付形式で選択してください\" with title \"エラー\""
fi
入力が終わったら、あとは⌘+Sを押して保存します。保存したときの名前がそのままクイックアクションのメニュー名になるので、お好きな名前をつけてください!
これで、テキストを選択して右クリック → サービスから実行するだけで、画面右上にスッと日時の通知が出るようになります。
【おまけ】クリップボードに入れてみる
せっかくなので、クリップボードに入れる手順も追加してみます。
クイックアクションでクリップボードに入れるのはとても簡単で、先ほどのシェルコマンドの通知の上に1行足すだけ!
# 結果の判定と通知
if [ "$RESULT" != "Error" ] && [ -n "$RESULT" ]; then
echo "$RESULT" | pbcopy
osascript -e "on run argv" \
-e "display notification (item 1 of argv) with title \"タイムスタンプ相互変換\"" \
-e "end run" "$RESULT"
else
osascript -e "display notification \"数値または YYYY-MM-DD HH:MM:SS 形式で選択してください\" with title \"エラー\""
fi
これで通知が出るのと同時に、クリップボードに結果が入力された状態になります。
まとめ
最後の方は完全に蛇足でしたが、今回は「シェルスクリプトとAutomatorを使うと色々できる」と言うことが実感できたのではないでしょうか?
昔はphpで作ったり、JavaScriptで作ってhtmlで使ったりと色々やった気がします。
今ならこの程度の処理であれば、シェルスクリプトに任すのがとっても手軽ですし、使い勝手も十分ですね!
特にAutomatorの手軽さは異常です!
何か「ちょっとしたコト」を簡略化したい時はぜひシェルスクリプト+Automatorをお試しください!