Biff:命令行中的日期时间瑞士军刀
速览
Biff是一款专为命令行设计的日期时间处理工具,旨在简化时间数据的解析与格式化。它支持多种复杂的时间格式转换和计算操作,极大提升了开发者处理时间数据的效率。作为命令行“瑞士军刀”,Biff为需要频繁操作时间戳的用户提供了便捷且强大的解决方案。
AI 深度解读
bttf:命令行中的日期时间瑞士军刀
背景
在命令行环境中处理日期和时间(datetime)一直是一个痛点。虽然 date 命令是 POSIX 标准的一部分,但其标志位和行为逻辑往往令人困惑,用户经常需要查阅手册才能有效使用。此外,现有的日期处理工具通常功能单一,难以满足复杂的算术运算、格式化或跨时区转换需求。
bttf(原名 Biff)是一个用 Rust 编写的命令行工具,旨在成为日期时间处理的“瑞士军刀”。它由 Jiff 库的作者开发,初衷是为了在命令行层面暴露 Jiff 库的功能,并提供一种简洁的方式来格式化日期时间或执行算术运算。该项目采用 MIT 或 UNLICENSE 双重许可。
值得注意的是,bttf 明确声明不兼容传统的 date 命令,也不是 POSIX date 的替代品。它不关心 POSIX 标准(除了 TZ 环境变量),而是专注于提供更现代、更灵活的日期时间处理能力。
核心内容
bttf 提供了丰富的日期时间处理能力,涵盖解析、格式化、算术运算、时区转换以及序列生成等。以下是其核心功能详解:
1. 基础时间与格式化
用户可以轻松打印当前时间,并通过 -f 参数指定格式。bttf 支持多种标准格式,如 RFC3339 和 RFC9557,也支持类 strftime 的自定义格式。
- 打印当前时间:
$ bttf Sat, May 10, 2025, 8:02:04 AM EDT - 自定义格式输出:
支持 RFC3339 和更详细的 RFC9557(包含时区名称):
$ 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]
2. 相对时间与多时间处理
bttf 允许在一个命令中处理多个相对时间点,如“昨天”、“下周六”、“上周一”等,并统一格式化输出。
- 多相对时间格式化:
$ 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
3. 时区转换与精度调整
支持将时间转换到特定时区(如 Asia/Bangkok),并可以对时间进行四舍五入,例如舍入到最近的 15 分钟。
- 时区转换与舍入:
$ bttf time in Asia/Bangkok now | bttf time round -i 15 -s minute 2025-05-10T19:15:00+07:00[Asia/Bangkok]
4. 日期算术运算
bttf 支持添加持续时间(duration),可以是负数(表示过去),也可以是自然语言描述(如 "1 week, 12 hours ago")。
- 添加持续时间:
$ 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]
5. 时间跨度(Span)计算
可以计算从过去某个时间点到现在的时间跨度,并支持按不同精度(年、月、日等)进行舍入。
- 计算时间跨度:
$ 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
6. 日志文件处理与管道集成
bttf 提供了 tag 和 untag 命令,使其能够嵌入到 Unix 管道中,处理非日期数据中的时间戳。例如,从日志文件中提取时间戳,转换为本地时间,并重新格式化。
- 日志时间戳转换示例:
$ head -n3 /tmp/access.log 2025-04-30T05:25:14Z INFO http.log.access.log0 handled request ... $ bttf tag lines /tmp/access.log | bttf time in system | bttf time fmt -f '%c' | head -n3 | 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
7. 序列生成(Sequence)
bttf time seq 命令功能强大,可以生成符合特定条件的日期序列。例如,生成接下来 5 个周一、周三或周五的特定时间,或生成每月的最后一个工作日。
- 生成特定工作日序列:
$ 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 ... - 生成每月最后一个工作日:
