
2026/05/28 11:58
bttf は、コマンドライン向けの万能な日時ツールです。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Summary:
bttf は、日付と時間の演算、パース、フォーマットのための強力な Rust ベースのコマンドラインユーティリティであり、MIT または UNLICENSE のどちらかのライセンスで提供されています。これは、レガシーの date コマンドへの単純な置き換えを行うものではなく、高精度なタイムゾーン処理(四捨五入付き)、柔軟な相対期間計算、Gitコミット履歴の詳細な分析など、高度な機能を重視しています。日付と時間の論理は Jiff ライブラリに構築され、ロバストなローカライゼーションには ICU4X が活用されており、異なる地域での正確なデータ処理を確保します(古い POSIX システムの制約を模倣せず、TZ 環境変数のみ POSIX に準拠しています)。ユーザーは、Windows、macOS、Linux のための事前コンパイル済み静的バイナリから、または Cargo(cargo install bttf; ローカールームサポートが必要な場合は --features locale を使用)を通じて簡単にインストールできます。コアロジックが将来 RFC 5545 サポートから分離する可能性はありますが、現在のバージョンでは特定規格(RFC3339、RFC9557)でのフォーマットやカスタム strftime の追加、期間の付加、日付列の生成、ログファイル内のタイムスタンプの再フォーマットなどのロバストな機能を提供しています。注目すべき特徴は、任意のデータ内の日付と時間を検出し、JSON ライン形式にまとめる tag コマンドです。Rust で書かれた最先端プロジェクトであるため、完全な安定性に達するまで bttf は破壊的変更を起こす可能性があります。採用を検討している方は、詳細についてはユーザーガイドまたは bttf --help をご参照ください。本文
bttf: コマンドラインによる日付時刻計算・解析ツール
bttf は、日付時刻の計算、解析、フォーマット化などをサポートするコマンドラインツールです。MIT ライセンスと UNLICENSE のデュアルライセンスを採用しています。
ドキュメント
- 概要: ユーザーガイドを参照し、基本的な概念を理解してください。
- 詳細:
またはbttf --help
を実行します。bttf <サブコマンド> --help - 比較: 他のツールとの類似性を確認する比較資料があります。
簡単な例とヒント
現在時刻の表示
$ bttf Sat, May 10, 2025, 8:02:04 AM EDT
ヒント:
2025 M05 10 のような出力の場合は、ロケールサポートが正しく設定されていない可能性があります。以下のいずれかの方法で対応してください:
という環境変数を設定するBTTF_LOCALE- GitHub リリース版バイナリを使用する
- ロケール機能が有効な状態でビルドする
形式指定での表示
$ bttf time fmt -f rfc3339 now 2025-05-10T08:08:30.101066734-04:00 $ bttf time fmt -f rfc9557 now 2025-05-10T08:08:33.420946447-04:00[America/New_York] $ bttf time fmt -f '%Y-%m-%d %H:%M:%S %Z' now 2025-05-10 08:08:48 EDT
複数の相対時刻の表示
$ bttf time fmt -f '%c' now -1d 'next sat' 'last monday' '9pm last mon' Sat, May 10, 2025, 10:44:39 AM EDT Fri, May 9, 2025, 10:44:39 AM EDT Sat, May 17, 2025, 10:44:39 AM EDT Mon, May 5, 2025, 10:44:39 AM EDT Mon, May 5, 2025, 9:00:00 PM EDT
タイムゾーン変換と丸め
$ bttf time in Asia/Bangkok now | bttf time round -i 15 -s minute 2025-05-10T19:15:00+07:00[Asia/Bangkok]
期間の追加・算出
$ bttf time add -1w now 2025-05-03T10:34:30.819577918-04:00[America/New_York] $ bttf time add '1 week, 12 hours ago' now 2025-05-02T22:34:44.114109514-04:00[America/New_York] $ bttf time add 6mo now 2025-11-10T10:34:49.023321635-05:00[America/New_York]
期間の計算と丸め
$ bttf span since 2025-01-20T12:00 2636h 1m 21s 324ms 691µs 216ns $ bttf span since 2025-01-20T12:00 -l year 3mo 20d 21h 1m 25s 171ms 886µs 534ns $ bttf span since 2025-01-20T12:00 | bttf span round -l year -s day 3mo 18d $ bttf span since 2025-01-20T12:00 | bttf span round -l day -s day 110d
ログファイルのタイムスタンプ置換
$ head -n3 /tmp/access.log 2025-04-30T05:25:14Z INFO http.log.access.log0 handled request 2025-04-30T05:25:17Z INFO http.log.access.log0 handled request 2025-04-30T05:25:18Z INFO http.log.access.log0 handled request $ head -n3 /tmp/access.log | bttf tag lines | bttf time in system | bttf time fmt -f '%c' | bttf untag -s Wed, Apr 30, 2025, 1:25:14 AM EDT INFO http.log.access.log0 handled request Wed, Apr 30, 2025, 1:25:17 AM EDT INFO http.log.access.log0 handled request Wed, Apr 30, 2025, 1:25:18 AM EDT INFO http.log.access.log0 handled request
指定されたスケジュールの生成とフォーマット
$ bttf time seq day today -c5 -H 9 -w mon,wed,fri | bttf time fmt -f '%c' Mon, May 12, 2025, 9:00:00 AM EDT Wed, May 14, 2025, 9:00:00 AM EDT Fri, May 16, 2025, 9:00:00 AM EDT Mon, May 19, 2025, 9:00:00 AM EDT Wed, May 21, 2025, 9:00:00 AM EDT
月の残日と特定月の最終平日の検索
# 今月の残りの全日を表示 $ bttf time seq daily --until $(bttf time end-of-month now) today 2025-05-10T00:00:00-04:00[America/New_York] ... # 次の 12 ヶ月分の最終平日を表示 $ bttf time seq -c12 monthly -w mon,tue,wed,thu,fri --set-position -1 | bttf time fmt -f '%a, %Y-%m-%d' Fri, 2025-05-30 Mon, 2025-06-30 ... # 今年末までの指定月の火曜日を表示 $ bttf time seq monthly -w 2-tue --until $(bttf time end-of-year now) | bttf time fmt -f '%a, %F' Tue, 2025-05-13 Tue, 2025-06-10 ...
Git リポジトリの最終コミット情報の一覧表化
$ git ls-files \ | bttf tag exec git log -n1 --format='%aI' \ | bttf time sort \ | bttf time fmt -f '%Y-%m-%d %H:%M:%S %z' \ | bttf untag -f '{tag}\t{data}' 2025-05-05 21:54:09 -0400 src/tz/timezone.rs 2025-05-05 21:54:09 -0400 src/tz/tzif.rs ...
インストールとビルド
バイナリ入手
- バイナリ名:
bttf - Crates.io: https://crates.io/bttf
- 事前コンパイル済みアーカイブ: Windows、macOS、Linux 用に対応。
Cargo を使ったインストール
- Rust プログラマー向けに
でインストール可能です。cargo install - デバッグビルドは予期せず大きくなります。
- ファイルサイズを縮小するには、strip コマンドを実行してください。
ロケール機能の有効化(オプション)
GitHub バイナリに標準で含まれるロケールサポートを利用したい場合:
cargo install bttf --features locale
ビルド手順
Rust のインストールが必要です。
リリースビルド
git clone https://github.com/BurntSushi/bttf cd bttf cargo build --release ./target/release/bttf --version
ロケール機能付きビルド
cargo build --release --features locale
musl ターゲットでの静的リンクビルド(Linux)
- musl ライブラリをインストールします。
- Rust ツールチェーンに musl サポートを追加し、再ビルドします:
rustup target add x86_64-unknown-linux-musl cargo build --release --target x86_64-unknown-linux-musl
テストの実行
# ユニットテストと統合テストを両方実行 cargo test # スナップショットテスト(cargo insta 使用) cargo insta test cargo insta review
動機・背景
- Jiff のコマンドライン露出: Jiff ライブラリ機能のコマンドラインインターフェースとしての目的です。
- 利便性向上:
コマンドの複雑なフラグやマニュアル依存性を解消するためです。date - 汎用性の拡張: データ中の日付時刻を検索し、JSON Lines フォーマットでラップする
のような新規機能を実装しました。bttf tag - ライブラリとの連携: Jiff と ICU4X を統合し、Jiff の API を実用的なレベル(1.0 相当)に到達させることを目標としました。
重要なお知らせ
ライセンス
- MIT ライセンスと UNLICENSE のデュアルライセンスです。
警告
- 破壊的変更の可能性: 現時点で不審かつ恣意的な破壊的変更をリリースする可能性があります。
互換性に関する事項
コマンドとの完全互換性は意図していません。date- ポジックス (POSIX) への対応(TZ 環境変数を除く)は対象外です。
- strftime スインタクをサポートしており、GNU date との大きな程度までの互換性があります。
- 日付互換性の高いプログラムが必要な場合は、POSIX date を使用してください。