bttf로 날짜·시간 연산 마스터하기: 현대적인 CLI 스위스 군용 나이프

터미널에서 날짜와 시간을 다루는 것은 악명 높게 답답한 경험입니다. 많은 개발자에게 표준 date 명령은 충분히 자주 사용되지 않아 그 특이한 플래그와 동작을 쉽게 잊어버리게 되며, 매번 매뉴얼을 찾아야 합니다.

여기에 bttf가 등장합니다. 날짜·시간 연산, 파싱, 포맷팅을 위해 설계된 명령줄 도구입니다. BurntSushi가 만든 bttf는 POSIX date를 그대로 대체하기 위한 것이 아니라, 인체공학과 강력함을 우선시하는 현대적인 대안입니다. Jiff 라이브러리를 기반으로 하여, 쉘에 정교한 날짜·시간 로직을 제공하고, 간결한 구문으로 복잡한 계산과 변환을 수행할 수 있게 합니다.

단순 포맷팅을 넘어

기본적인 시간 출력은 기본이지만, bttf는 상대 시간 계산과 시퀀스 생성에서 뛰어납니다. 특정 날짜를 찾기 위해 복잡한 bash 래퍼를 작성하는 대신, bttf는 자연어에 가까운 질의와 정밀한 연산을 허용합니다.

상대 시간 및 연산

기간을 더하거나 빼는 것은 간단합니다. 일주일 전 날짜를 찾거나 6개월 후 날짜를 계산하든, 구문은 직관적입니다:

$ bttf time add -1w now
$ bttf time add '1 week, 12 hours ago' now
$ bttf time add 6mo now

복잡한 시퀀스 생성

bttf의 가장 강력한 기능 중 하나는 특정 제약 조건에 따라 날짜 시퀀스를 생성할 수 있다는 점입니다. 이는 일정 관리나 보고 작업에 특히 유용합니다. 예를 들어, 연말까지 매달 두 번째 화요일을 생성하는 작업을 한 줄로 수행할 수 있습니다:

$ bttf time seq monthly -w 2-tue --until $(bttf time end-of year now) | bttf time fmt -f '%a, %F'

한 커뮤니티 구성원이 언급했듯이, 이 기능은 뉴스레터 일정 잡기나 휴일 조정 캘린더와 같은 작업에 수십 줄의 맞춤 bash 스크립트를 대체할 수 있습니다.

"Tagging"과 파이프라인 통합의 힘

대부분의 날짜·시간 도구는 datetime 문자열만 처리합니다. bttf는 임의의 데이터에 작동할 수 있는 독특한 tag 명령을 도입합니다. 로그나 명령 출력에서 찾은 datetime을 JSON 라인 형식으로 감싸면, bttf는 주변 컨텍스트를 유지하면서 시간 데이터에 대한 연산을 수행할 수 있습니다.

이를 통해 로그 파일의 타임스탬프를 제자리에서 재포맷하는 등 고급 워크플로우가 가능해집니다:

$ bttf tag lines /tmp/access.log | bttf time in system | bttf time fmt -f '%c' | bttf untag -s

실제 예시: Git 저장소 분석

작성자는 tag exec 명령을 git log와 결합하여 그 다재다능함을 보여줍니다. 이를 통해 사용자는 저장소의 모든 파일을 최신 커밋 날짜 기준으로 정렬하고, 로컬 시간으로 포맷된 목록을 얻을 수 있습니다:

$ 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}'

기술적 기반: 시민 시간 vs. 절대 순간

bttf( Jiff 라이브러리를 통해)에서 중요한 기술적 구분은 “시민 시간”(civil time)과 “절대 순간”(absolute instant)을 분리하는 것입니다.

많은 표준 라이브러리와 GNU date 명령은 이 둘을 종종 혼동하여, 일광 절약 시간(DST) 전환 시 미묘한 버그를 초래합니다. HN 토론에서 강조된 바와 같이:

"2024-03-08 미국/뉴욕 기준으로 30일 후가 무엇인지 답할 수 없습니다. DST 때문에 경과 시간은 29일 23시간이 될 수도, 30일 0시간이 될 수도이며, 대부분의 API는 이를 알려주지 않고 조용히 하나를 선택합니다."

이들을 서로 다른 타입으로 취급함으로써, bttf는 연산이 예측 가능하고 수학적으로 타당하도록 보장하며, TC39(자바스크립트)의 Temporal 제안 철학을 따릅니다.

설치 및 성능

bttf는 Rust로 작성되었으며 crates.io를 통해 제공됩니다. Windows, macOS, Linux용 사전 컴파일 바이너리를 포함한 유연한 설치 옵션을 제공합니다.

바이너리 크기나 컴파일 시간에 신경 쓰는 경우, 설치 시 로케일 지원을 비활성화할 수 있습니다:

cargo install bttf --no-default-features

결론

일부는 LLM이 특화된 datetime DSL의 필요성을 없앴다고 주장하지만, bttf와 같은 도구의 정밀성, 재현성, 파이프라인 연계 가능성은 자동화와 시스템 관리에 필수적입니다. 원시 타임스탬프와 인간이 읽을 수 있는 로컬 시간 사이의 격차를 메우면서, bttf는 터미널을 수동 날짜 계산의 장소에서 시간 데이터 처리를 위한 강력한 엔진으로 변모시킵니다.

Sources