문제

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?

도움이 되었습니까?

해결책

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.

다른 팁

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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top