← 返回信息流
AI 资讯Hacker News·7 天前2 源报道

Biff:命令行中的日期时间瑞士军刀

原标题:Biff is a command line datetime Swiss army knife

速览

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 提供了 taguntag 命令,使其能够嵌入到 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
    ...
    
  • 生成每月最后一个工作日
查看原文 →github.com