One of my apps has a lunar calendar integrated, and since lunar calendars aren’t as predictable as solar calendars, I have to provide an offset from the backend to determine the correct date. That offset update process is tedious, and I have been forgetting to update it recently… Hence, automation is a must.

STEP 1: THE SOURCE

Let’s find a reliable source to fetch the lunar date from… I like this one.

STEP 2: THE PARSER

I first tried to use beautifulsoup, which was an utter failure. The library is so bad, and didn’t work as I expect. Maybe it was because of unicode issues, I don’t know…

In any case, I then just wrote my own regex, and wished I had just done that in the first place:

regex = re.compile(r"<div class=\"date\">\s*(\w+), (\d+)", flags=(re.DOTALL))
STEP 3: THE BASE DATE

Unfortunately, my app doesn’t query the date from the backend (silly me), it queries the offset instead (/facepalm). Hence, I need to know what the base date is in order to calculate the offset! The base date is calculated in the app from a library I compiled (called MCEngine). So, all I had to do is write a command line wrapper around it to give me the date:

int main(int argc, const char * argv[])
{
    @autoreleasepool
    {                
        MCDate *date = [MCDate dateNow];
        printf("%s~%s",
               [[date stringifyHijriDay] UTF8String],
               [[date stringifyWeekday] UTF8String]);
    }
    return 0;
}
STEP 4: THE GLITCH

As with most software, there is this awkward edge case that you have to take care of. Since I am querying the date from the website above, I may (for example) query it on Monday, when they are displaying the date for Tuesday! So, that’s why in the code above I am printing the weekday (stringifyWeekday). Then, using some simple rules, I can find the “circular distance” from two indexes with the following:

weekday_diff = min(
    abs(objc_index - actual_index),
    abs(len(en_weekdays) - objc_index - actual_index))

Conclusion

I realized there is another thing I must take care of… The weekday_diff is always positive, but I need to know in which direction is the diff (i.e. is the objc date ahead, or is the website ahead?).