Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!

04.04.2024

Чому Go вміє форматувати дати "як Ruby?"

Натрапив випадково на те, що в стандартній бібліотеці Go є, проміж різних стандартних форматів, формат дати time.RubyDate. Тільки Ruby - немає всяких PythonDate, JavaDate, або HaskellDate. Хоч це мене, як рубіста, переповнює гордістю, доведеться все ж поставити питання — навіщо?

Щоб відповісти, знаходимо той файл на GitHub та закопуємося в його blame. (Це типова процедура розшуку причини, яку я роблю щоразу, коли бібліотека поводиться незрозуміло.) Корисніше за все тут функція “open blame prior to this change”. Знаходимо коміт, в якому рядок зʼявився, та з нього - PR, в якому той коміт зробили.

Виходить, в далекому 2010 році, за два місяці після випуску мови на публіку, команда Go виявила розбіжність форматування Ruby та стандартного “Unix date”. Як вони її виявили та чому та розбіжність була варта включення в стандартну бібліотеку? Бо в тому форматі повертав дати тогочасний API Twitter. На той час, певно, цього було достатньо, щоб в мові Go зʼявився формат дат “як у Ruby”.

Наразі Twitter API (наскільки він живий?) повертає дати в стандарті ISO 8601. Якого, до речі, в Go немає! Є тільки формат time.RFC3339, який, як я сьогодні дізнався, тільки перетинається з ISO 8601. Бо обидва стандарти пропонують набагато більше єдиного вірного формату. Наскільки більше? Пропоную роздивитись ось цю жахливу діаграму. Форматування часу — це складно!