I am currently working on a task management application that allows users to create and assign tasks, set start and due dates and track work progress.
In my app users do not plan hours, they just set start and due dates as 10-Oct-2013 - 20-Oct-2013.
The problems happen in case when Reporter (task creator) and Assignee live in a different timezones so at the same time it may be Tuesday for Reporter but still Monday for Assignee. And vice versa.
Obviously there are two ways of dealing with dates:
- Use server (or account settings) timezone to define current day for all users
- Use each user’s local timezone to define his current day
But both ways lead to total madness. Just a look at the examples:
The madness of using common timezone for all users:
- Say, it’s Monday morning. Assignee opens his task list. Suddenly he sees that all the tasks with deadline for today are marked as overdue! He believes he has the whole day to finish them, but they are overdue already!
- Also Assignee can see tasks with the start date on Tuesday scheduled for today! That can happen if my timezone is UTC-9 and account’s timezone is UTC+9.
- In other timezone combinations Assignee can see tasks with the start date equal to his today but they are scheduled for tomorrow.
The madness of using each users local time:
- Reporter lives in UTC+9 and Assignee lives in UTC-6. If reporter creates task that should be started immediately (and sets today as start date) then Assignee gets the task scheduled for tomorrow because his local time is still yesterday.
- Say the task start date is 10-Oct. At the same time it’s status will be already “In progress” for Reporter but “Starts tomorrow” for Assignee.
- If Reporter build a report with Assignee’s current tasks then the app will use his local time to define today. But for the Assignee it may be already tomorrow so his current tasks are totally different.
Does this problem have a solution? I tried ideas of converting the dates to each user’s timezone to let different users see the same start date as a different value, but that does not work properly in all cases.