Вышла утилита bttf — консольный инструмент для работы с датами и временем. Распространяется под двойной лицензией MIT или UNLICENSE. bttf умеет парсить, форматировать и делать арифметику с датами, а главное — он понимает человеческие фразы вроде next sat, last monday или 9pm last mon.
Просто bttf в терминале — выводит текущее время. Можно задать формат: bttf time fmt -f rfc3339 now даст строку по RFC 3339, -f rfc9557 — с часовым поясом. Поддерживаются даже локальные форматы вроде %c. Если на выходе вместо привычного Sat, May 10... видна кириллица или 2025 M05 10 — значит, не настроена локаль. Нужен бинарник с GitHub или сборка с флагом locale и переменная BTTF_LOCALE.
Утилита умеет конвертировать временные зоны и округлять: bttf time in Asia/Bangkok now | bttf time round -i 15 -s minute. Работает с длительностями: bttf span since 2025-01-20T12:00 покажет разницу с высокой точностью, а пайп на bttf span round округлит до нужного уровня.
Одна из сильных сторон — команда bttf tag lines. Она ищет временные метки в произвольных данных (например, в логах) и оборачивает их в JSON lines. Потом можно пропустить через bttf time in system и bttf time fmt, а bttf untag вернёт данные обратно. Автор сам признаёт, что не уверен, насколько этот подход получит распространение, но других таких инструментов он не видел.
Ещё bttf умеет генерировать последовательности дат: следующие 5 понедельников, сред или пятниц в 9 утра, все оставшиеся дни месяца, вторые вторники каждого месяца до конца года, последний рабочий день в каждом из следующих 12 месяцев.
Внутри логики дат почти нет — bttf использует библиотеку Jiff. Локализацию даёт ICU4X через jiff-icu. Сам инструмент написан на Rust. Готовые бинарники статически скомпилированы для Windows, macOS и Linux. Установка через cargo install bttf или cargo install bttf --features locale.
Автор предупреждает: возможны ломающие изменения, обратной совместимости с date не планируется, POSIX не в приоритете (кроме переменной TZ). Форматирование через bttf time fmt частично совместимо с strftime от GNU date. Он создал bttf, чтобы удобно выставить возможности Jiff в командную строку, и для того чтобы протестировать саму библиотеку в реальных сценариях — проверить производительность, найти недостающие API.