java.util.Date and jodaTime timezone

from the UI (jsf) I get a java.util.Date Object (lets call ita). As far as I know this one does not have any timezone information.

Afterwards, I use code like this to do some business logic:

Date bar = new DateTime(a).plusDays(1).toDate()

And finally I store this bar into my database

I wonder if I will get some timezone issues with this? Because JodaTime uses timezone information from the server?!

For the database, I use @Temporal(TemporalType.*) and on my Oracle DB datatype DATE.

Background: I use JodaTime for adding and subtracting days/hours/weeks because if the nice API

Answers


24 hours != 1 day

You ignored the comments by Jon Skeet. You must become conciously aware of the fact that one day does not mean 24 hours. Because of anomalies such as Daylight Saving Time (DST), a day can run longer or shorter than 24 hours.

You need to be clear about which period your situation requires, 24 hours or one day.

Time Zone

For adding 24 hours, time zone is irrelevant.

Time zone is crucial in determining dates and days. For any given moment, the date varies around the world. For example a new day dawns earlier in Paris than in Montréal.

Furthermore, time zone defines rules for handling anomalies such as Daylight Time Saving (DST).

When omitted, your JVM’s current default time zone is applied. This is risky as that default can change at any moment during runtime by any code in any thread of any app in that JVM calling TimeZone.setDefault.

I suggest you always specify a time zone by passing the optional argument rather than rely implicitly on the JVM’s current default. Ditto for Locale.

java.time supplants Joda-Time

The makers of Joda-Time went on to define JSR 310, now implemented as the java.time framework built into Java 8 and later. While Joda-Time is still actively supported, the makers have asked us to move to java.time as soon as is convenient.

Convert your java.util.Date to an Instant, a moment on the timeline in UTC.

Instant instant = myJavaUtilDate.toInstant();
Add 24 hours

Adding 24 hour is simple.

Instant instantPlus24Hours = instant.plus( 24 , ChronoUnit.Hours );
Add 1 day

Adding a day requires the context of a particular time zone. An Instant is always in UTC by definition. So we need to apply a time zone to generate a ZonedDateTime.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
ZonedDateTime zdtDayLater = zdt.plusDays( 1 );

Your date will be stored in your local time zone, but there is no information on the db about the timezone (assuming you don't handle it manually).


If you want to use the Joda-Time library, because of the various shortcomings of the Date class. You can do it

Date dt = new Date();
DateTime dateOriginal = new DateTime(dt);
DateTime datePlusOne = dateOriginal.plusDays(1);

Update: For timezone issue, you can to it

LocalDateTime.from(dt.toInstant().atZone(ZoneId.of("UTC"))).plusDays(1);

For timezone related issue, you can check

  1. Is java.sql.Timestamp timezone specific?

Need Your Help

Find all drive letters in Java

java windows

For a project I'm working on. I need to look for an executable on the filesystem. For UNIX derivatives, I assume the user has the file in the mighty $PATH variable, but there is no such thing on Wi...

Orchard - How to remove cache from a controller?

c# asp.net orchardcms orchardcms-1.6 orchardcms-1.7

Using Orchard 1.7.1 CMS. I am creating a project 'Football' I am running the program and using a console app 'Boots' to access a controller on the football project and download a list of footballs.