ブログ内検索

テック

「このUNIXタイムスタンプいつ?」をサクッと解決!Mac開発者のための快適設定

timestamps-converter-cover.avif

こんにちは。思い立ったらすぐ効率化したいこうじです。

最近Laravel製プロジェクトでこういうことがあるんです。

こうじ
こうじ
あれ?このタイムスタンプ日時なんだ?

定期的にJobがちゃんと動いてるか確認する際にJobsテーブルを確認するんですが、その際にいっつもこれ、思うんです。

決して頻度が多いわけではないんですが、滅多にやらないわけでもない微妙な立ち位置のUNIXタイムスタンプ。

今回はこれを自分用に使いやすく使えるようにしていきたいと思います!

こうじ
こうじ
ニッチだけど、決してなくならない系のお悩み(個人的感想)

今までの解決方法

今までは、「そんな毎回じゃないし、都度調べるかな。」なんてそんな選択肢すら考える以前の問題で、実際にその場になった時に「ああ!いつだこれ。めんどくせー。」と言いながら重い腰を上げて調べるといった感じです(笑)

そして今の解決方法はこんな感じ

素直にAIに聞く

最近はAIに聞くのが手っ取り早いです。ちょっときつい言い方ですが根は優しいので教えてくれます。

こうじ
こうじ
ねーねーじぇみ子さん。「1778198400」って何時?
じぇみ子
じぇみ子
はぁ。そんなことで私の仕事を止めないでちょうだい。答えは2026年5月8日の9時よ。

ありがたいツールを使う

一昔前だったら「UNIX タイムスタンプ 変換」とかやったら、同じような悩みを持っている人が作ったありがたいツールが公開されてたりするので、それを使わせていただいたりしておりました。

とはいえ、いずれにしても一手間ではあるんですよね。

せっかくだから自作しようぜ!

何が手間かってブラウザ開くのもAIに聞くのも何回かトラックパッドをポチポチして画面に移動してからカタカタしないといけないのが面倒!

なので、自分が使いやすいように今後の為に自作することにしました!

シンプルにするために、とりあえず目の前の意味不明数値を日付でわかりやすく見れるのを目標にし、それ以外全部エラーにします。

自作コマンドでサクッと解決

自作コマンドのいいところはターミナルを立ち上げてササッとコマンド実行できるのがとっても便利!

僕は結構いろんな用途でショートカット作ってラクさせてもらってます。

その一端に今回のタイムスタンプ変換もつっこんでしまいます!

.zshrc(.bashrc)を開く

ターミナルを起動したらホームに移動して.zshrc(古い環境だと.bashrcかも)を開いてください。

bash
vim ~/.zshrc

コマンドを追加

開いたら以下の行を追加してください。

実際の処理はPythonを使用します。Macなら使用するライブラリも標準のものしか使用していないので、特に何かをインストールする必要はありません。

bash
# UNIXタイムスタンプを見やすいフォーマットで表示
alias ts='python3 -c "import datetime, sys; print(datetime.datetime.fromtimestamp(int(sys.argv[1])).strftime(\"%Y-%m-%d %H:%M:%S\"))"'

やっていることは

  1. 引数で受け取ったUNIXタイムスタンプ数値を

  2. %Y-%m-%d %H:%M:%S(年-月-日 時:分:秒)に変換して

  3. 表示(print())しろ!

これだけです。めっちゃ簡単!

追加後は保存して閉じます。保存は:wqと入力すれば保存して閉じます。

反映してテスト

保存が終わったら、反映しないとコマンドが使用可能になりませんので、以下のコマンドで反映してください。

bash
source ~/.zshrc

保存が終わったら以下のコマンドを入力してみてください。

bash
ts 1778198400

# こんな感じで出力される!
2026-05-08 09:00:00
こうじ
こうじ
ターミナルだと起動も早いし、開いてコピペで完結できるのは便利!

Python3が入っていない場合

古いOSの時はPython2が標準インストールされていましたが、最近のmacOSは標準でPythonがプリインストールされていません。

ターミナルでpython3 --versionと入力してエラーになる場合は、Pythonをインストールする必要があります。

導入方法は多々ありますが、参考までにインストール方法の一例をご紹介します。

  • コマンドラインツールで入れる(バージョンによる)
    ターミナルでpython3と打つと「インストールしますか?」という案内が出るので、そのままインストール。

  • Homebrewで入れる(エンジニア向け)
    brew install python を実行。

ミリ秒にも対応させる

あーほらほら。みんなJavaScript好きでしょ?JavaScriptの場合は、時間比較する時ってミリ秒でどっちが先かとかこれから時間出したりとかよくしますよね。

なので、せっかくなのでミリ秒も対応させてみましょう!

先ほどのコマンドを変更

先ほど入力してもらったコマンドを以下のように変更します。

bash
# 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コマンドの後に数値をコピペするだけ!

bash
source ~/.zshrc
bash
# 設定を反映
source ~/.zshrc

# コマンドを実行
ts 1778198400000

# こんな感じで出力される!
2026-05-08 09:00:00

これで、どちらで投げても日付をもらえるようになりました!

まぁ、0が多いか少ないかの違いなんですけどね(笑)。ただ何も考えずにコピペで投げられるのは助かりますよね!きっとそう!

逆バージョンも実装してみる

ここまでくるとみんな思うんじゃないですか?日付フォーマットからタイムスタンプ出せないの?って。

まぁ、使い道あるかどうか微妙ですけど(笑)。

ただせっかくなんで、「2026-12-30 09:00:00」みたいな感じで日付を渡したら、タイムスタンプを受け取れる機能も追加してみましょう!

先ほどのコマンドを変更

先ほど変更したコマンドを以下のように変更します。

エイリアス(alias)だとスペースを含む文字列の処理が厳しいので、今回は関数(function)として書き換えます。

bash
# 日時 <-> タイムスタンプを相互変換
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\"')
" "$@"
}

設定を反映してコマンドを実行します。

bash
# 設定を反映
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」と入力すると候補に出るので選択してください。

クイックアクションを作成

新規作成を選択
クイックアクションを選択
基本的には開いたままでOK
メニューからシェルスクリプトを検索してダブルクリック

スクリプトを貼り付け

シェルスクリプトのブロックを追加するとその箇所に入力ができるようになるので以下のコマンドを貼り付けてください。

bash
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行足すだけ!

bash
# 結果の判定と通知
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をお試しください!

こうじ
こうじ
そのうち画像コンバーターもご紹介します

関連記事

apple-emacs-shortcut-cover.avif

Macユーザーに捧ぐ!日常が変わるEmacs風ショートカット厳選まとめ

Macの標準機能で利用できるEmacsキーバインドを使って日常のテキスト入力などを効率化!

adobe-graduation-ceremony-cover.avif

【Adobe卒業式】年間10万円の節約!AdobeからApple Creator Studioに乗り換えた話

高額なAdobe税から卒業!解約の違約金トラップや、解約前にやるべき事などを解説。

vim-believer-cover.avif

爆速コーディングを実現するVimを布教する記事【入門編】

俺選!実務で爆速化する神コマンドを厳選して布教します。

timemachine-to-mac-transfer-cover.avif

意外と簡単!Time MachineでMac環境をお引越し(M1→M5)

Time MachineでMacを移行したらほぼそのまま復元できた話。

vite-first-guide-cover.avif

「アナタ無しでは生きられない!」Viteを使って今スグ爆速の開発環境を整えよ!

保存した瞬間にブラウザが更新されるViteの「ホットリロード」を活用した爆速開発環境を作る手順を解説!

jetstream-profile-image-cover.avif

Jetstream(Laravel)でプロフィール画像が表示されない会場はこちらです

Jetstreamで画像が保存・表示されない原因をケースごとにまとめました。

wordpress-enqueue-scripts-cover.avif

コピペで完了!WordPressでスクリプトにdefer・async・moduleを付ける方法

WordPressでスクリプトにdefer・async・moduleを付ける方法を解説。コピペで使えるサンプル付き。

cloud-document-cover.avif

使ってみたいよね?Adobeクラウドドキュメントを試してみた

Adobeクラウドドキュメントを試して感じたメリットとデメリットをまとめました。

lv-sl-error-cover.avif

Laravelでstorageの画像が表示されない件

Webアプリ(Laravel)をサーバー移動した際に画像が表示されなかった場合の備忘録です。

railx6sj-cover.avif

ssh接続エラー: Too many authentication failuresをどうにかする

SSH接続時に出現する「Too many authentication failures」のエラーの解決法についてご紹介。

kusanagi-sever-error-cover.avif

KUSANAGIでサイトが表示されない場合は初心にかえる

KUSANAGIサーバーでどうやっても希望のドメインがサイトから見れなかった場合に試してたい選択肢をご紹介。

kusanagi-laravel-cover.avif

「爆速KUSANAGI」に『爆速Laravel』をインストール

爆速WordPressで人気の高いKUSANAGIサーバーに、Laravelをインストールし、爆速で使って見ようという事になりました。


新着記事一覧

kindle-comic.png

無料で漫画を一気読み!Kindleで出産レポ・育児漫画などなど

apple-emacs-shortcut-cover.avif

Macユーザーに捧ぐ!日常が変わるEmacs風ショートカット厳選まとめ

Macの標準機能で利用できるEmacsキーバインドを使って日常のテキスト入力などを効率化!

adobe-graduation-ceremony-cover.avif

【Adobe卒業式】年間10万円の節約!AdobeからApple Creator Studioに乗り換えた話

高額なAdobe税から卒業!解約の違約金トラップや、解約前にやるべき事などを解説。

vim-believer-cover.avif

爆速コーディングを実現するVimを布教する記事【入門編】

俺選!実務で爆速化する神コマンドを厳選して布教します。

timemachine-to-mac-transfer-cover.avif

意外と簡単!Time MachineでMac環境をお引越し(M1→M5)

Time MachineでMacを移行したらほぼそのまま復元できた話。

apple-fitness-plus-cover.avif

体重乱高下アラフォーがApple Fitness+に行き着いた話

激しい体重の増減を繰り返したチョコザップユーザーが、コスパ最強の「Apple Fitness+」に乗り換えました。

vite-first-guide-cover.avif

「アナタ無しでは生きられない!」Viteを使って今スグ爆速の開発環境を整えよ!

保存した瞬間にブラウザが更新されるViteの「ホットリロード」を活用した爆速開発環境を作る手順を解説!

with-pomodoro-technique-cover.avif

「私のコトですか?」過集中&注意力散漫な人に刺さる!効率化ではなく“生存戦略”のポモドーロ術

集中力が「0か200」しかない人に朗報!ポモドーロ・テクニックが脳の暴走を止める最強の特効薬でした。

jetstream-profile-image-cover.avif

Jetstream(Laravel)でプロフィール画像が表示されない会場はこちらです

Jetstreamで画像が保存・表示されない原因をケースごとにまとめました。

wordpress-enqueue-scripts-cover.avif

コピペで完了!WordPressでスクリプトにdefer・async・moduleを付ける方法

WordPressでスクリプトにdefer・async・moduleを付ける方法を解説。コピペで使えるサンプル付き。

cloud-document-cover.avif

使ってみたいよね?Adobeクラウドドキュメントを試してみた

Adobeクラウドドキュメントを試して感じたメリットとデメリットをまとめました。

lv-sl-error-cover.avif

Laravelでstorageの画像が表示されない件

Webアプリ(Laravel)をサーバー移動した際に画像が表示されなかった場合の備忘録です。