Convert UTC into Local Time on Android

后端 未结 5 1566
眼角桃花
眼角桃花 2020-11-29 04:26

In my project, I have get the API response in json format. I get a string value of time in UTC time format like this Jul 16, 2013 12:08:59 AM.
I need to cha

相关标签:
5条回答
  • 2020-11-29 04:47

    Use the following code.

    TimeZone defaultTimeZone = TimeZone.getDefault();
    String strDefaultTimeZone = defaultTimeZone.getDisplayName(false, TimeZone.SHORT);
    
    //The code you use
    String aDate = getValue("dateTime", aEventJson);
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss z");
    simpleDateFormat.setTimeZone(TimeZone.getTimeZone(strDefaultTimeZone));
    String formattedDate = simpleDateFormat.format(aDate);
    

    This should work.

    0 讨论(0)
  • 2020-11-29 04:49
    //your UTC time var
    long time = UTCtime;
    
    //convert it
    Time timeFormat = new Time();
    timeFormat.set(time+TimeZone.getDefault().getOffset(time));
    
    //use the value
    long localTime = timeFormat.toMillis(true);
    
    0 讨论(0)
  • 2020-11-29 05:00

    I should like to contribute the modern answer. While SimpleDateFormat was the class we had for parsing and formatting date-times in 2013 (apart from Joda-Time), it is now long outdated, and we have so much better in java.time or JSR-310, the modern Java date and time API that came out with Java 8 in 2014.

    But most Android devices still don’t run Java 8, I hear you say. Fortunately you can still use the modern Java date and time API on them through the ThreeTenABP, the backport of JSR-310 to Android Java 7. Details are in this question: How to use ThreeTenABP in Android Project.

    Now the code is:

        DateTimeFormatter formatter 
                = DateTimeFormatter.ofPattern("MMM dd, uuuu hh:mm:ss a", Locale.ENGLISH);
        String aDate = "Jul 16, 2013 12:08:59 AM";
        String formattedDate = LocalDateTime.parse(aDate, formatter)
                .atOffset(ZoneOffset.UTC)
                .atZoneSameInstant(ZoneId.systemDefault())
                .format(formatter);
        System.out.println(formattedDate);
    

    Since my computer is running Europe/Copenhagen time zone, which in July is 2 hours ahead of UTC, this prints

    Jul 16, 2013 02:08:59 AM
    

    Further points:

    • Since you have AM in your string, I assumed your hours are within AM, from 1 through 12. To parse and format them correctly you need lowercase h in the format pattern string. Uppercase H is for hour-of-day from 0 through 23.
    • Prefer to give an explcit locale to the formatter (whether SimpleDateFormat or DateTimeFormatter). If no locale is given, the formatter will use the device’s default locale. “Jul” and “AM” are in English, and your code may run nicely on many devices until one day it runs on a device with non-English locale and crashes, and you have a hard time figuring out why.
    • If you can, give the desired time zone explictly, for example as ZoneId.of("Asia/Kolkata"). The JVM’s default time zone may be changed by other parts of your program or other programs running in the same JVM, so is not reliable.
    0 讨论(0)
  • 2020-11-29 05:00

    1.Local to UTC Converter

    public static String localToUTC(String dateFormat, String datesToConvert) {
    
    
            String dateToReturn = datesToConvert;
    
            SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
            sdf.setTimeZone(TimeZone.getDefault());
            Date gmt = null;
    
            SimpleDateFormat sdfOutPutToSend = new SimpleDateFormat(dateFormat);
            sdfOutPutToSend.setTimeZone(TimeZone.getTimeZone("UTC"));
    
            try {
    
                gmt = sdf.parse(datesToConvert);
                dateToReturn = sdfOutPutToSend.format(gmt);
    
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return dateToReturn;
        }
    

    2. UTC to Local Converter

    public static String uTCToLocal(String dateFormatInPut, String dateFomratOutPut, String datesToConvert) {
    
    
        String dateToReturn = datesToConvert;
    
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormatInPut);
        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
    
        Date gmt = null;
    
        SimpleDateFormat sdfOutPutToSend = new SimpleDateFormat(dateFomratOutPut);
        sdfOutPutToSend.setTimeZone(TimeZone.getDefault());
    
        try {
    
            gmt = sdf.parse(datesToConvert);
            dateToReturn = sdfOutPutToSend.format(gmt);
    
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return dateToReturn; }
    
    0 讨论(0)
  • 2020-11-29 05:04

    Here's my attempt:

    String dateStr = "Jul 16, 2013 12:08:59 AM";
    SimpleDateFormat df = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a", Locale.ENGLISH);
    df.setTimeZone(TimeZone.getTimeZone("UTC"));
    Date date = df.parse(dateStr);
    df.setTimeZone(TimeZone.getDefault());
    String formattedDate = df.format(date);
    

    Also notice the "a" for the am/pm marker...

    0 讨论(0)
提交回复
热议问题