Extended iCal rant from a timezone warrior

Apple's iCal has an unbelievably annoying, poorly thought-out system for handling timezone changes. Here's how it works: when you change the timezone of your system-clock, it adjusts all of your calendar items, so if you go from Pacific to Eastern time, you noon lunch appointment is "fixed" so that it shows up at 3PM — the Eastern equivalent of 12PM Pacific.

What is the use-case for this? If I'm in San Francisco and I'm going to Toronto in a week and I make a 6PM dinner appointment with my brother and sister-in-law, should I enter it as a 3PM appointment, knowing that my computer will adjust this to 6PM when I land in Toronto and change my system clock? And if I do, how do I avoid double-booking myself when someone else asks me to have dinner at the same time and my calendar shows that 6PM isn't booked, that's fine?

In other words, why does Apple think I want to use Greenwich Mean Time, rather than my internal, subjective frame-of-reference, as my clock?

Now, Apple has updated iCal with a "switch timezones off" feature. Which doesn't work.

Here's how it doesn't work: Create an appointment with timezone "support" switched off. Make it from noon to 1PM. Now, go to your system clock and change your timezone to one hour back. The appointment will shift back by one hour. That's with timezone "support" switched off.

If you switch the "support" on and change timezones, iCal will ask you if you want to change the timezone "display" for your appointments. Answering "no" seems to solve the problem, as all of your events will stay localized for whatever timezone you were in when you created them. What's more, whenever you create an event, it gives you the option of specifying a timezone for it and adjusts it on your behalf — so if you create a 12PM appointment while in EST and specify that its timezone is PST, iCal will move the event back to 9AM for you.

This stinks. For starters, that's all well and good when you and I make a lunch date for noon next week in New York, but it falls down when you call me back an hour later and ask me if we can make it brunch at 2PM — now I have to go into iCal and work out that my noon-Eastern/9AM-Pacific appointment is really a 2PM-Eastern/11AM-Pacific appointment and, rather than simply bumping a noon appointment to 2PM, I need to subtract three and move a 9AM appointment to 11AM.

It gets worse, though: say you use the timezone "support" and just don't worry about the timezones. All start/stop times stay as you entered them, provided you keep on clicking "no" every time you change zones and iCal asks you if you want to update your display. So far so good. But woe betide you if you create an appointment with an alarm — your 9AM alarm will ring a 6AM when you're on the west coast (if you created it while your clock was set Eastern), even though it will show up as a 9AM alarm in your calendar. There's a user-hostile design decision!

It gets even worse: Just wait until you synch iCal with your PalmOS device! Last night, I moved from Mountain to Central time. I adjusted the time-zone on my Clie and my Powerbook, but asked iCal to leave all my appointments in Mountain time. Then I made the mistake of synching my Clie: iSync decided that all the appointments in my Clie were an hour behind, and moved them up an hour — including my wake-up alarm and the alarm for my 8:30AM conference call (Thanks, Apple!).

I have toyed with the idea of leaving my timezone set to GMT or some arbitrary value, and then spoofing my clock by manually setting it forward or back whenever I get off an airplane, but this royally screws up your email (which arrives at the remote end with bogus timestamps that indicates that it was sent hours in the past or the future, depending), and messes up any kind of incremental backup that uses change-dates to determine which version of a file to overwrite.

So, after all that whingeing, I have a solution of sorts. I used to use an app called "iCalTimeZoneFixer" that would automatically adjust your calendar items when you changed timezones, undoing the damage wrought by Apple's system. But with Panther and the new iCal, this doesn't work so good anymore: about 70% of the time, running iCalTimeZoneFixer deletes all the items in my calendar.

So this morning, while I was missing my phone call because my alarm hadn't gone off, I figured out a fix of sorts. It hinges on the fact that your iCal calendar file (which you'll find in ~/Library/Calendars/$CALENDARNAME.ics") is a flat text file, that you can edit with a text-editor like BBEdit.

1. Quit iCal, then make a copy of your calendar file. Open your calendar file in a text-editor (I used BBEdit)

2. Look for the string that denotes the city/timezone your calendar is localized to, i.e. "America/Chicago" or "America/San Francisco"

3. Go to System Preferences -> Date and Time -> Time Zone and use the map interface to find out the name of your desired timezone (i.e., if you're in America/San Francisco on your way to America/Denver, America/Denver is your desired timezone)

4. Search-and-replace the existing timezone string with your desired timezone and save

5. Start iCal up again, then go back to System Peferences -> Date and Time -> Time Zone and change your timezone. iCal will "adjust" your calendar and you'll find yourself looking at the correct times again

There you have it: using a text-editor and search-and-replace, you can undo the stupidest feature I've ever seen in a calendar app.