Domanda

I'm trying to convert some string that is in UTC time to a java Calendar object that should be set to GMT-5.

My current UTC string input is this:

UTC date : 20050329174411

I use this code (I detect the 'pattern' as shown below):

DateFormat dateFormat = new SimpleDateFormat(pattern);
Date date = dateFormat.parse(utcDate);
calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT-5"));
calendar.setTime(date);

I then printed the time like this:

calendar.getTime()

And I got this result:

GMT date : Tue Mar 29 17:44:11 EST 2005

I need to support theses date/time string patterns:

FORMAT_UTC4 = "yyyy";           
FORMAT_UTC6 = "yyyyMM";         
FORMAT_UTC8 = "yyyyMMdd";       
FORMAT_UTC10 = "yyyyMMddHH";    
FORMAT_UTC12 = "yyyyMMddHHmm";  
FORMAT_UTC14 = "yyyyMMddHHmmss";

I would be expecting the time to be set to "12:44:11". I have read a couple of examples and I find date time handling pretty confusing. For me, it's always the same, I get some sort of string formatted UTC and I convert it to GMT-5. I really feel it should be easy!

Ref 1 : How can I get the current date and time in UTC or GMT in Java?

Ref 2 : How to handle calendar TimeZones using Java?

È stato utile?

Soluzione

You must set the SimpleDateFormat's time zone to UTC before parsing the date. Else, it uses your default timezone.

And to display the date in the "GMT-5" timezone, you should use another DateFormat, with the timezone set to GMT-5, and format the date with this DateFormat. The toString() method of Date uses your default time zone to transform the date into something readable.

Altri suggerimenti

java.time

Note that GMT-5 or timezone offset of -05:00 hours is a fixed offset i.e. independent of the DST and type to represent a date-time with timezone offset is OffsetDateTime.

Demo:

import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;

public class Main {
    public static void main(String[] args) {
        Instant instant = Instant.ofEpochMilli(20050329174411L);
        OffsetDateTime odt = instant.atOffset(ZoneOffset.of("-05:00"));
        // Alternatively
        // OffsetDateTime.ofInstant(instant, ZoneOffset.of("-05:00"));
        System.out.println(odt);
    }
}

Output:

2605-05-15T18:52:54.411-05:00

If you are looking for an automatic adjustment of timezone offset as per the DST, use ZonedDateTime.

Demo:

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        Instant instant = Instant.ofEpochMilli(20050329174411L);
        ZonedDateTime zdt = instant.atZone(ZoneId.of("America/Chicago"));
        // Alternatively
        // ZonedDateTime.ofInstant(instant, ZoneId.of("America/Chicago"));
        System.out.println(zdt);
    }
}

Output:

2605-05-15T18:52:54.411-05:00[America/Chicago]

Learn more about java.time, the modern date-time API* from Trail: Date Time.

If at all you need an object of java.util.Calendar from this object of ZonedDateTime, you can do so as follows:

Calendar calendar = Calendar.getInstance();
calendar.setTime(Date.from(zdt.toInstant()));

* For any reason, if you have to stick to Java 6 or Java 7, you can use ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and How to use ThreeTenABP in Android Project.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top