bttfによる日時演算のマスター術: モダンなCLIスイスアーミーナイフ
ターミナルでの日付と時刻の扱いは、非常にフラストレーションの溜まる経験として知られています。多くの開発者にとって、標準的な date コマンドは、使用頻度が低いためにフラグや独特な挙動が使いこなせず、使うたびにマニュアルを読み直すという繰り返しのサイクルに陥りがちです。そこで登場するのが、日時演算、パース、およびフォーマットのためのコマンドライン「スイスアーミーナイフ」である bttf です。
BurntSushi によって作成された bttf は、POSIX date の置き換えとしてではなく、より直感的で強力な代替手段として設計されています。複雑な時間計算やフォーマット作業を、面倒なシェルスクリプトやカスタムコードなしで行える簡潔な方法を提供することを目指しています。
単純なフォーマットを超えて
bttf は、現在の時刻を表示したり strftime 構文を使用して日付をフォーマットしたりといった基本的なタスクを実行できますが、その真の力は、相対的な時間や複雑なシーケンスを扱う能力にあります。
相対的な時間と演算
複雑なフラグと格闘する代わりに、bttf は自然言語に近い演算を可能にします。現在の時刻に期間を加算したり、過去や未来の特定の日付を見つけたりすることが簡単にできます。
# 現在の時刻に1週間と12時間を加算する
$ bttf time add '1 week, 12 hours ago' now
# 特定の日付からの経過時間を、最も近い日に丸めて取得する
$ bttf span since 2025-01-20T12:00 | bttf span round -l day -s day
強力なシーケンス生成
最も際立った機能の一つは seq コマンドです。これは、数十行の Bash スクリプトに取って代わることができます。例えば、年末までの毎月の第2火曜日の一覧を生成することは、ワンライナーで可能です。
$ bttf time seq monthly -w 2-tue --until $(bttf time end-of year now) | bttf time fmt -f '%a, %F'
アーキテクチャ: Jiff と「市民の時間」問題
内部では、bttf は Jiff によって駆動されています。Jiff は、多くの日時 API にある根本的な欠陥、すなわち「市民の時間 (civil time)」と「絶対的な瞬間 (absolute instants)」の混同に対処する Rust ライブラリです。
コミュニティのメンバーが指摘しているように、ほとんどの API は、夏時間 (DST) を扱う際に、どちらか一方を黙って選択してしまいます。例えば、特定のタイムゾーンにおいて「今から30日後」と尋ねた場合、DST の移行が発生するかどうかによって、経過時間が29日と23時間になるか、30日と0時間になるかのいずれかになります。Jiff (JavaScript の TC39 Temporal プロポーザルに触発されたもの) は、これらを異なる型として扱い、計算が明示的で予測可能であることを保証します。
高度なワークフロー: tag コマンド
おそらく bttf の最も革新的な機能は tag コマンドです。これによって、ツールは日時だけでなく、任意のデータを処理できるようになります。テキストのストリーム内でタイムスタンプを特定し、それらを処理のために JSON lines 形式でラップし、その後元のテキストに「アンタグ」して戻すことができます。
これにより、強力なパイプラインが実現します。例えば、著者は、git リポジトリ内のすべてのファイルを、最終コミット日によってソートし、ローカルタイムでフォーマットして一覧表示する方法を示しています。
$ git ls-files | bttf tag exec git log -n1 --format='%aI' | bttf time in system | bttf time sort | bttf time fmt -f '%a %Y-%m-%d %H:%M:%S' | bttf untag -f '{tag}|t{data}'
このワークフローでは、bttf tag exec が各ファイルに対して git コマンドを並列実行し、その後の bttf time コマンドがタイムゾーンの変換、ソート、およびフォーマットを行い、最終的な untag が、フォーマットされた日付とともに元のファイルパスを復元します。
コミュニティの視点: CLI vs. AI
bttf のリリースは、LLM の時代における特化型 CLI ツールの有用性に関する興味深い議論を巻き起こ起こしました。一部のユーザーは、一度限りのタイムスタンプの変換や日付の計算は、今や AI に尋ねる方が効率的であると主張しています。
しかし、他のユーザーは、プログラム的なワークフロー、自動化、および AI エージェントへの統合 (ツールを関数として呼び出せる場合) において、決定論的で高速かつ正確な CLI ツールは不可欠であると指摘しています。ニュースレターのスケジューリングに使用されていた 40 行のカスタム Bash コードを、bttf time seq だけで置き換えることができたと、あるユーザーは述べています。
インストールと使用方法
btf を試してみたい方は、Windows、macOS、および Linux 用のプリコンパイル済みバイナリ、または Rust 開発者の場合は Cargo を通じて利用可能です。
cargo install bttf
注: ロケールサポートはデフォルトで有効になっていますが、バイナリサイズを小さくし、コンパイル速度を上げるために、インストール時に無効にすることもできます (--no-default-features)。