I've never used Joda time before now, but I know of it's reputation

and it seems like a natural fit for the problem I'm trying to solve.



I'm working on an application that sends notifications to users'

iPhones. These notifications can be generated at any time of day, and

I have a requirement to support the concept of a "Do Not Disturb"

(DND) interval for each user. The reasoning is that some users may

wish to avoid being bothered with notifications during certain hours

of the day (such as the overnight hours). If the application needs to

send a notification to a user it should do so only if the current time

falls outside of the user's specified DND interval.



I plan on storing the following information in each user's profile:



 - User's time zone

 - DND begin hour of day  & minute of hour

 - DND end hour of day  & minute of hour



With this information a user can effectively tell the system, for

example, "I'm in the US/Pacific time zone, and I do not wish to be

notified between 00:00 and 06:00". In this case I create the following

Joda objects using information from the user's profile:



 LocalTime dndBeginTime = new LocalTime(0, 0);

 LocalTime dndEndTime = new LocalTime(6, 0);

 DateTimeZone userTimeZone = DateTimeZone.forID("US/Pacific");



Now I need to figure out where the current time falls in relation to

the DND interval specified by the user, so I use this code:



 // First create an Interval with the user's time zone and

 // bounded by the begin & end times in the user's profile

 DateTime dndBegin = dndBeginTime.toDateTimeToday(userTimeZone);

 DateTime dndEnd = dndEndTime.toDateTimeToday(userTimeZone);

 Interval dndInterval = new Interval(dndBegin, dndEnd);



 if (dndInterval.containsNow()) {

    // Inside the DND interval- do not send the notification

 }

 else {

    // Outside the DND interval- send the notification

 }



This code seemed to work well until I hit upon a problem caused by

Daylight Savings Time. Suppose the user specifies a time that is

within the 02:00 hour, for example:



 LocalTime dndBeginTime = new LocalTime(2, 30);



In this case my code will fail on the following line during the

transition from Standard Time to Daylight Savings Time:



 DateTime dndBegin = dndBeginTime.toDateTimeToday(userTimeZone);



I get the following exception (I used DateTimeUtils to set the date

for testing- great feature BTW):



 org.joda.time.IllegalFieldValueException: Value 2 for hourOfDay is

not supported:

 Illegal instant due to time zone offset transition:

2010-03-14T02:30:00.000 (America/Los_Angeles)



I understand why this is happening: there is no 02:30 instant on March

14, 2010. Time jumps from 01:59 directly to 03:00. However, I'd like

to deal with this more gracefully. Logically, the user still has a DND

internal- it's just been shortened by 30 minutes.



Does anyone have any suggestions for dealing with this? I suspect

there may be a better way somewhere in the API, but I'm not seeing it

right now.                                        
------------------------------------------------------------------------------
This SF.net email is sponsored by Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________
Joda-interest mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/joda-interest

Reply via email to