A developer shares valuable lessons from creating the Zemen App, an offline Ethiopian calendar and date converter in Flutter. This project offers insights for supporting diverse calendar systems globally.
Most date libraries assume the world runs on one calendar. But what if yours is different? This challenge faced a developer building the «Zemen» App in Flutter. What this means for you is a clear path for developers to create apps that support diverse calendar systems, like the Ethiopian one, reaching a wider global user base.
The «Zemen» App is a unique, 100% offline Ethiopian calendar converter. It handles conversions between Ethiopian and Gregorian calendars, tracking national holidays like Enkutatash, Meskel, and Timkat. It also includes a full database of Orthodox Tewahedo fasting days, all without any network calls.
At the app's core is a small, self-contained calendar engine written in Dart. This engine converts dates both ways using exact integer math. It precisely models the 13-month Ethiopian year, including its leap year rules, and is covered by anchor-based tests.
The Ethiopian calendar has 13 months: twelve of 30 days each, then Pagume, a short 13th month with 5 days (or 6 in a leap year). A leap year is divisible by 4, matching the Julian calendar. The new year, Enkutatash, falls on September 11 in most years (or September 12 before a Gregorian leap year). It runs roughly seven to eight years behind the Gregorian calendar – for instance, in October 2026, it was 2019 in Ethiopia.
This regularity simplifies the engine: every month except Pagume has a fixed length. Instead of direct conversion, the app uses a neutral pivot: the Julian Day Number (JDN), counting days since a fixed astronomical epoch. The process is: Ethiopian date → JDN → Gregorian date, and vice versa. Each direction is a pure function, making the code trivially testable. The Ethiopian epoch (1 Meskerem 1 EE) corresponds to JDN 1724221. This approach adapts to any non-Gregorian calendar.
The «Zemen» App is a unique, 100% offline Ethiopian calendar converter. It handles conversions between Ethiopian and Gregorian calendars, tracking national holidays like Enkutatash, Meskel, and Timkat. It also includes a full database of Orthodox Tewahedo fasting days, all without any network calls.
At the app's core is a small, self-contained calendar engine written in Dart. This engine converts dates both ways using exact integer math. It precisely models the 13-month Ethiopian year, including its leap year rules, and is covered by anchor-based tests.
The Ethiopian calendar has 13 months: twelve of 30 days each, then Pagume, a short 13th month with 5 days (or 6 in a leap year). A leap year is divisible by 4, matching the Julian calendar. The new year, Enkutatash, falls on September 11 in most years (or September 12 before a Gregorian leap year). It runs roughly seven to eight years behind the Gregorian calendar – for instance, in October 2026, it was 2019 in Ethiopia.
This regularity simplifies the engine: every month except Pagume has a fixed length. Instead of direct conversion, the app uses a neutral pivot: the Julian Day Number (JDN), counting days since a fixed astronomical epoch. The process is: Ethiopian date → JDN → Gregorian date, and vice versa. Each direction is a pure function, making the code trivially testable. The Ethiopian epoch (1 Meskerem 1 EE) corresponds to JDN 1724221. This approach adapts to any non-Gregorian calendar.