views:

62

answers:

2

I want to get the UTC time for 01/01/2100 in Java to '2100-01-01 00:00:00'. I am getting "2100-01-01 00:08:00". Any idea, how to correct this.

public Date getFinalTime() {
    Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));

    DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
    Date finalTime = null;

    try
    {
        finalTime = df.parse("01/01/2100");            
    } catch (ParseException e)
    {
        e.printStackTrace();
    }

    calendar.setTime(finalTime);
    return calendar.getTime();
}
+1  A: 

You need to set the time zone of the SimpleDateFormat object as well, otherwise it assumes the default time zone.

Anyway, it seems like using only a Calendar is enough in your case. Use its setters to set the right values for all fields (year, month, day, hour, etc), and then retrieve the time.

Eyal Schneider
If the OP only has a string as input, it would make sense to use the built-in classes to do the parsing rather than parsing it himself, wouldn't it?
Jon Skeet
@Jon Skeet: I didn't understand from his explanation that he is given a variable string as an input. I assumed it is a fixed value, detoting some time limit (year 2100).
Eyal Schneider
@Eyal: I assumed it was just a sample - if he doesn't actually want to parse text, it would certainly be odd (and wrong) to use SimpleDateFormat.
Jon Skeet
+4  A: 

You need to specify the time zone for the SimpleDateFormat as well - currently that's parsing midnight local time which is ending up as 8am UTC.

TimeZone utc = TimeZone.getTimeZone("UTC");
Calendar calendar = Calendar.getInstance(utc);

DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
df.setTimeZone(utc);
Date finalTime = null;

try
{
    finalTime = df.parse("01/01/2100");            
} catch (ParseException e)
{
    e.printStackTrace();
}

calendar.setTime(finalTime);

As ever though, I would personally recommend using Joda Time which is far more capable in general. I'd be happy to translate your example into Joda Time if you want.

Additionally, I see you're returning calendar.getTime() - that's just the same as returning finalTime as soon as you've computed it.

Finally, just catching a ParseException and carrying on as if it didn't happen is a very bad idea. I'm hoping this is just sample code and it doesn't reflect your real method. Likewise I'm assuming that really you'll be parsing some other text - if you're not, then as Eyal said, you should just call methods on Calendar directly. (Or, again, use Joda Time.)

Jon Skeet