<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: burntsushi</title><link>https://news.ycombinator.com/user?id=burntsushi</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 28 May 2026 17:43:27 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=burntsushi" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by burntsushi in "Bttf is a command line datetime Swiss army knife"]]></title><description><![CDATA[
<p>ripgrep is a required dependency of codex when installing it via brew on macOS. So you should at least not see it if you fall into that scenario. :-)</p>
]]></description><pubDate>Thu, 28 May 2026 17:08:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=48312039</link><dc:creator>burntsushi</dc:creator><comments>https://news.ycombinator.com/item?id=48312039</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48312039</guid></item><item><title><![CDATA[New comment by burntsushi in "Biff is a command line datetime Swiss army knife"]]></title><description><![CDATA[
<p>I did. I always do. I just missed this one. Or if I saw it, it didn't register for me and felt like it was just an old archaic tool. Which... is probably still true, but I under-estimated its mindshare. Just an honest unknown unknown.</p>
]]></description><pubDate>Thu, 28 May 2026 16:56:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=48311795</link><dc:creator>burntsushi</dc:creator><comments>https://news.ycombinator.com/item?id=48311795</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48311795</guid></item><item><title><![CDATA[New comment by burntsushi in "Biff is a command line datetime Swiss army knife"]]></title><description><![CDATA[
<p>My decisions about naming aren't limited or prescribed by what is in a standard or not. :-)</p>
]]></description><pubDate>Thu, 28 May 2026 16:53:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=48311741</link><dc:creator>burntsushi</dc:creator><comments>https://news.ycombinator.com/item?id=48311741</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48311741</guid></item><item><title><![CDATA[New comment by burntsushi in "Biff is a command line datetime Swiss army knife"]]></title><description><![CDATA[
<p>I've renamed the project to bttf :-)</p>
]]></description><pubDate>Thu, 28 May 2026 15:54:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=48310761</link><dc:creator>burntsushi</dc:creator><comments>https://news.ycombinator.com/item?id=48310761</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48310761</guid></item><item><title><![CDATA[New comment by burntsushi in "Biff is a command line datetime Swiss army knife"]]></title><description><![CDATA[
<p>Oh yes definitely. Was always the plan. I was honestly just hoping someone would publish a crate to do that for me.<p>To be clear, I don't mean publishing a crate to read an environment variable. Of course. I mean a crate that converts a POSIX locale into a Unicode locale.<p>I guess there's probably a 20% solution that gets 80% of the way there. e.g.,<p><pre><code>    $ BTTF_LOCALE="$(echo $LANG | sed 's/_/-/' | sed 's/\..*//')" bttf
    Thu, May 28, 2026, 11:46:21 AM EDT
</code></pre>
If Biff just did that as a stop-gap until the full solution lands, I bet it would work in lots of cases.</p>
]]></description><pubDate>Thu, 28 May 2026 15:44:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=48310640</link><dc:creator>burntsushi</dc:creator><comments>https://news.ycombinator.com/item?id=48310640</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48310640</guid></item><item><title><![CDATA[New comment by burntsushi in "Biff is a command line datetime Swiss army knife"]]></title><description><![CDATA[
<p>Back to the Future jokes never get old. I love it.<p>I still want one of those hover boards!</p>
]]></description><pubDate>Thu, 28 May 2026 15:42:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=48310609</link><dc:creator>burntsushi</dc:creator><comments>https://news.ycombinator.com/item?id=48310609</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48310609</guid></item><item><title><![CDATA[New comment by burntsushi in "Biff is a command line datetime Swiss army knife"]]></title><description><![CDATA[
<p>@dang - Could you update the post title please to say "bttf" instead of "Biff"? Thank you!</p>
]]></description><pubDate>Thu, 28 May 2026 15:19:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=48310220</link><dc:creator>burntsushi</dc:creator><comments>https://news.ycombinator.com/item?id=48310220</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48310220</guid></item><item><title><![CDATA[New comment by burntsushi in "Bttf is a command line datetime Swiss army knife"]]></title><description><![CDATA[
<p>You win the naming contest. The project has been renamed: <a href="https://github.com/BurntSushi/bttf/pull/14" rel="nofollow">https://github.com/BurntSushi/bttf/pull/14</a></p>
]]></description><pubDate>Thu, 28 May 2026 15:17:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=48310191</link><dc:creator>burntsushi</dc:creator><comments>https://news.ycombinator.com/item?id=48310191</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48310191</guid></item><item><title><![CDATA[New comment by burntsushi in "Biff is a command line datetime Swiss army knife"]]></title><description><![CDATA[
<p>Yeah this was before my time. I never did email from a terminal. Which probably explains why I was okay with naming it Biff.<p>In any case, I've renamed the project to bttf: <a href="https://github.com/BurntSushi/bttf/pull/14" rel="nofollow">https://github.com/BurntSushi/bttf/pull/14</a></p>
]]></description><pubDate>Thu, 28 May 2026 15:16:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=48310174</link><dc:creator>burntsushi</dc:creator><comments>https://news.ycombinator.com/item?id=48310174</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48310174</guid></item><item><title><![CDATA[New comment by burntsushi in "Biff is a command line datetime Swiss army knife"]]></title><description><![CDATA[
<p>Yes!!! To spell it out (with the new biff -> bttf name):<p><pre><code>    $ bttf time seq monthly -w 2-tue -u 1y | bttf time fmt -f '%c'
    Tue, Jun 9, 2026, 11:15:11 AM EDT
    Tue, Jul 14, 2026, 11:15:11 AM EDT
    Tue, Aug 11, 2026, 11:15:11 AM EDT
    Tue, Sep 8, 2026, 11:15:11 AM EDT
    Tue, Oct 13, 2026, 11:15:11 AM EDT
    Tue, Nov 10, 2026, 11:15:11 AM EST
    Tue, Dec 8, 2026, 11:15:11 AM EST
    Tue, Jan 12, 2027, 11:15:11 AM EST
    Tue, Feb 9, 2027, 11:15:11 AM EST
    Tue, Mar 9, 2027, 11:15:11 AM EST
    Tue, Apr 13, 2027, 11:15:11 AM EDT
    Tue, May 11, 2027, 11:15:11 AM EDT
</code></pre>
More examples here: <a href="https://github.com/BurntSushi/biff/blob/master/GUIDE.md#datetime-sequences" rel="nofollow">https://github.com/BurntSushi/biff/blob/master/GUIDE.md#date...</a><p>Implementing the RFC 5545 recurrence rules was quite a lot of fun: <a href="https://github.com/BurntSushi/biff/blob/4c75d5cf6e09310e74ca74ad3abde48a73b648ab/src/ical.rs" rel="nofollow">https://github.com/BurntSushi/biff/blob/4c75d5cf6e09310e74ca...</a><p>I'm quite proud of it, because if you look at the implementation, it's almost <i>entirely</i> about dealing with the specification rules. All of the datetime bullshit (including handling time zones) is all deferred to Jiff.<p>Plus, the tests are nearly 4,000 lines. While the implementation is 2,000 lines.</p>
]]></description><pubDate>Thu, 28 May 2026 15:15:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=48310159</link><dc:creator>burntsushi</dc:creator><comments>https://news.ycombinator.com/item?id=48310159</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48310159</guid></item><item><title><![CDATA[New comment by burntsushi in "Biff is a command line datetime Swiss army knife"]]></title><description><![CDATA[
<p>Oh nice thank you!</p>
]]></description><pubDate>Thu, 28 May 2026 12:13:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=48307824</link><dc:creator>burntsushi</dc:creator><comments>https://news.ycombinator.com/item?id=48307824</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48307824</guid></item><item><title><![CDATA[New comment by burntsushi in "Biff is a command line datetime Swiss army knife"]]></title><description><![CDATA[
<p>I like this</p>
]]></description><pubDate>Thu, 28 May 2026 12:03:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=48307742</link><dc:creator>burntsushi</dc:creator><comments>https://news.ycombinator.com/item?id=48307742</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48307742</guid></item><item><title><![CDATA[New comment by burntsushi in "Biff is a command line datetime Swiss army knife"]]></title><description><![CDATA[
<p>I honestly don't know. Which is... Not Great.</p>
]]></description><pubDate>Thu, 28 May 2026 11:05:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=48307287</link><dc:creator>burntsushi</dc:creator><comments>https://news.ycombinator.com/item?id=48307287</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48307287</guid></item><item><title><![CDATA[New comment by burntsushi in "Biff is a command line datetime Swiss army knife"]]></title><description><![CDATA[
<p>That's... not terrible. Biff isn't exactly popular (yet?), so a name change isn't out of the question. Both of those names (and `biff`) are already taken on crates.io. Which is maybe not a huge problem. IDK. Naming is hard.</p>
]]></description><pubDate>Thu, 28 May 2026 11:04:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=48307280</link><dc:creator>burntsushi</dc:creator><comments>https://news.ycombinator.com/item?id=48307280</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48307280</guid></item><item><title><![CDATA[New comment by burntsushi in "Biff is a command line datetime Swiss army knife"]]></title><description><![CDATA[
<p>Yes! dateutils is great! I have a comparison about it here: <a href="https://github.com/BurntSushi/biff/blob/master/COMPARISON.md#dateutils" rel="nofollow">https://github.com/BurntSushi/biff/blob/master/COMPARISON.md...</a><p>The comparison with GNU date is also likely informative.</p>
]]></description><pubDate>Thu, 28 May 2026 10:58:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=48307246</link><dc:creator>burntsushi</dc:creator><comments>https://news.ycombinator.com/item?id=48307246</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48307246</guid></item><item><title><![CDATA[New comment by burntsushi in "Bttf is a command line datetime Swiss army knife"]]></title><description><![CDATA[
<p>I'm the author of Bttf. I just wanted to share a really cool example of something that Bttf can do that I _think_ is kinda hard to do otherwise. (And also, I want to make an assertion about it and I hope this will lead to me being wrong and learning something new.)<p>The use case is: "I want to see a list of all files in a repository, sorted in ascending order of when it was most recently changed according to source control. I also want to highlight the time with color, make it be in local time and format it in my own bespoke way using strftime." Here's the full command (run from the root of <a href="https://github.com/BurntSushi/ripgrep" rel="nofollow">https://github.com/BurntSushi/ripgrep</a>):<p><pre><code>    $ 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}'
    ...
    Thu 2025-10-30 13:30:14 crates/ignore/Cargo.toml
    Sat 2025-11-29 14:11:38 crates/core/flags/lowargs.rs
    Wed 2025-12-17 11:38:12 tests/misc.rs
    Wed 2025-12-17 11:38:12 tests/util.rs
    Thu 2026-02-12 20:39:46 crates/ignore/src/default_types.rs
    Fri 2026-02-20 16:06:29 crates/core/flags/config.rs
    Fri 2026-02-27 11:25:19 GUIDE.md
    Fri 2026-02-27 11:25:19 crates/core/flags/defs.rs
    Mon 2026-05-25 23:56:53 CONTRIBUTING.md
    Tue 2026-05-26 08:32:43 AI_POLICY.md
</code></pre>
Or even ask for a specific time window:<p><pre><code>    $ git ls-files |
        bttf tag exec git log -n1 --format='%aI' |
        bttf time in system |
        bttf time cmp ge 2026-01-01 |
        bttf time cmp lt 2026-04-01 |
        bttf time sort |
        bttf time fmt -f '%a %Y-%m-%d %H:%M:%S' |
        bttf untag -f '{tag}|t{data}'
    Thu 2026-02-12 20:39:46 crates/ignore/src/default_types.rs
    Fri 2026-02-20 16:06:29 crates/core/flags/config.rs
    Fri 2026-02-27 11:25:19 GUIDE.md
    Fri 2026-02-27 11:25:19 crates/core/flags/defs.rs
</code></pre>
If you run this on a big repository, it will take quite a lot of time because `git log -n1` takes a long time. I think this is the fastest way to get the most recent commit time on a single file? (That's the assertion that I hope someone can correct me on!) In any case, `bttf tag exec` is using parallelism under the hood to make this even faster.</p>
]]></description><pubDate>Thu, 28 May 2026 10:58:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=48307240</link><dc:creator>burntsushi</dc:creator><comments>https://news.ycombinator.com/item?id=48307240</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48307240</guid></item><item><title><![CDATA[New comment by burntsushi in "Bttf is a command line datetime Swiss army knife"]]></title><description><![CDATA[
<p>Yeah the name collision is unfortunate, but probably fine. The name Biff was just too good to pass up.<p>The name comes from the fact that Biff is a character in Back to the Future, <i>and</i> it rhymes with Jiff[1]. Jiff is the datetime library that Biff uses.<p>"Make like a tree and get out of here!" <a href="https://www.youtube.com/shorts/9Jabplo2pZU" rel="nofollow">https://www.youtube.com/shorts/9Jabplo2pZU</a><p>[1]: <a href="https://github.com/BurntSushi/jiff" rel="nofollow">https://github.com/BurntSushi/jiff</a></p>
]]></description><pubDate>Thu, 28 May 2026 10:44:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=48307131</link><dc:creator>burntsushi</dc:creator><comments>https://news.ycombinator.com/item?id=48307131</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48307131</guid></item><item><title><![CDATA[New comment by burntsushi in "Biff is a command line datetime Swiss army knife"]]></title><description><![CDATA[
<p>This is a fair critique actually. And this shouldn't be the default. It is for now because I haven't gotten around to making Biff read your POSIX locale settings and converting them to a Unicode locale. If you build with `cargo build --release --features locale` (or get Biff from a release binary), then you can do:<p><pre><code>    $ BIFF_LOCALE=en-US biff
    Thu, May 28, 2026, 6:38:09 AM EDT
</code></pre>
If that doesn't work, then you can enable logging to see an error message:<p><pre><code>    $ BIFF_LOCALE=watwat BIFF_LOG=warn biff
    2026-05-28T06:39:08.876336708-04:00[America/New_York]|WARN|src/main.rs:76: reading `BIFF_LOCALE` failed, using unknown locale `und`: failed to parse `BIFF_LOCALE` environment variable: The given language subtag is invalid
    2026 M05 28, Thu 06:39:08
</code></pre>
What you're seeing is what ICU4X does when the user's locale is unknown or undetermined. The `M` prefix occurs to indicate that the number is the month, and is unrelated to the name. For example:<p><pre><code>    $ BIFF_LOCALE=watwat biff time fmt -f '%c' '1 month'
    2026 M06 28, Sun 06:39:50</code></pre></p>
]]></description><pubDate>Thu, 28 May 2026 10:40:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=48307104</link><dc:creator>burntsushi</dc:creator><comments>https://news.ycombinator.com/item?id=48307104</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48307104</guid></item><item><title><![CDATA[Bttf is a command line datetime Swiss army knife]]></title><description><![CDATA[
<p>Article URL: <a href="https://github.com/BurntSushi/bttf">https://github.com/BurntSushi/bttf</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=48303881">https://news.ycombinator.com/item?id=48303881</a></p>
<p>Points: 99</p>
<p># Comments: 70</p>
]]></description><pubDate>Thu, 28 May 2026 02:58:44 +0000</pubDate><link>https://github.com/BurntSushi/bttf</link><dc:creator>burntsushi</dc:creator><comments>https://news.ycombinator.com/item?id=48303881</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48303881</guid></item><item><title><![CDATA[New comment by burntsushi in "RE#: how we built the fastest regex engine in F#"]]></title><description><![CDATA[
<p>> for simple string literals it will definitely lose to Hyperscan and Rust regex since they have a high effort left-to-right SIMD algorithm that we cannot easily use<p>I think "simple string literals" undersells it. I think that description works for engines like RE2 or Go's regex engine, but not Hyperscan or Rust regex. (And I would put Hyperscan in another category than even Rust regex.) Granted, it is arguably difficult to be succinct here since it's a heuristic with difficult-to-predict failure points. But something like: "patterns from which a small number of string literals can be extracted."</p>
]]></description><pubDate>Wed, 04 Mar 2026 13:57:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=47247447</link><dc:creator>burntsushi</dc:creator><comments>https://news.ycombinator.com/item?id=47247447</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47247447</guid></item></channel></rss>