Abubakkar
Abubakkar

Reputation: 15644

Joda Time Not getting expected result

I have a date string of format MM/dd/yyyy that I am parsing using SimpleDateFormat

Now say the startDateString is 11/26/2012 for the code given below. I set the time zone to America/New_York

SimpleDateFormat df=new SimpleDateFormat("MM/dd/yyyy");

Date st = df.parse(startDateString);

Calendar startDate = Calendar.getInstance(TimeZone.getTimeZone("America/New_York"));

System.out.println("BEFORE : Start Date :"+startDate.getTime());

startDate.setTime(st);

System.out.println("AFTER : Start Date :"+startDate.getTime());

DateTimeZone timezone = DateTimeZone.forID("America/New_York");

DateTime actualStartDate = new DateTime(startDate,timezone);

System.out.println("JODA DATE TIME "+ actualStartDate);

The outout of above code snippet:

BEFORE : Start Date :Tue Nov 27 12:26:51 IST 2012

AFTER : Start Date :Mon Nov 26 00:00:00 IST 2012 //ok it sets date to 26th
                                                 //with all time parameters as 0.

JODA DATE TIME 2012-11-25T13:30:00.000-05:00 // here the date and 
                                             // time parameter are changed

What my problem is when I create my actualStartDate like this :

DateTime actualStartDate = new DateTime(startDate,timezone);

The date changes to 25 and the time changes to 13:00:00
I think this is because of timezone zone difference between India and US (total -10:30 from IST Indian time)

What I want is JODA DATE TIME 2012-11-26T00:00:00.000-05:00

Do I manually set the parameters of time inside my startDate calendar instance to 0 ?

Upvotes: 0

Views: 446

Answers (1)

Jon Skeet
Jon Skeet

Reputation: 1499770

I suspect the problem is that you're parsing in your default time zone. This:

AFTER : Start Date :Mon Nov 26 00:00:00 IST 2012

shows that the instant in time you're using is midnight IST - not midnight in New York or in UTC. Currently IST is 18:30 in UTC, so the instant you're representing is 25-11-25T18:30:00Z.

When you convert that into New York time, you end up with 2012-11-25T13:30:00-05:00, which is exactly what Joda Time is doing.

I would strongly advise that:

  • You avoid using the Java libraries at all (that's where all the problems have come from here - both in parsing, and the result of Date.toString() confusing you)
  • You use LocalDate to represent a date, rather than DateTime. You're trying to represent a date after all, not an instant in time. This bypasses time zones entirely, as a date doesn't have a time zone.

Sample code:

import java.util.*;

import org.joda.time.*;
import org.joda.time.format.*;

public class Test {
    public static void main (String[] args) {
        String text = "11/26/2012";
        DateTimeFormatter formatter =
            DateTimeFormat.forPattern("MM/dd/yyyy")
                          .withLocale(Locale.US);

        LocalDate date = formatter.parseLocalDate(text);
        System.out.println(date);
    }    
}

Once you've got a LocalDate, if you want to find out the instant at which that day started in a particular time zone, you can use LocalDate.toDateTimeAtStartOfDay(DateTimeZone).

Upvotes: 3

Related Questions