Get current time in a given timezone : android

53,233

Solution 1

I got it to work like this :

TimeZone tz = TimeZone.getTimeZone("GMT+05:30");
Calendar c = Calendar.getInstance(tz);
String time = String.format("%02d" , c.get(Calendar.HOUR_OF_DAY))+":"+
            String.format("%02d" , c.get(Calendar.MINUTE))+":"+
.                   String.format("%02d" , c.get(Calendar.SECOND))+":"+
    .           String.format("%03d" , c.get(Calendar.MILLISECOND));

Also, every other time conversion based on this date should also be used with this timezone, otherwise, the default timezone of device will be used and the time will be converted based on that timezone.

Solution 2

// Backup the system's timezone
TimeZone backup = TimeZone.getDefault();

String timezoneS = "GMT-1";
TimeZone tz = TimeZone.getTimeZone(timezoneS);
TimeZone.setDefault(tz);
// Now onwards, the default timezone will be GMT-1 until changed again

Calendar cal = Calendar.getInstance();
Date date = cal.getTime();
String timeS = String.format("Your time on %s:%s", timezoneS, date);
System.out.println(timeS);

// Restore the original timezone
TimeZone.setDefault(backup);
System.out.println(new Date());

Solution 3

java.time

Both the older date-time classes bundled with Java and the third-party Joda-Time library have been supplanted by the java.time framework built into Java 8 and later. These classes supplant the old troublesome date-time classes such as java.util.Date. See Oracle Tutorial. Much of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport and further adapted to Android in ThreeTenABP.

By the way, never refer to an offset-from-UTC with a single digit of hours such as -7, as that is non-standard and will be incompatible with various protocols and libraries. Always pad with a zero for second digit, such as -07.

If all you have is an offset rather than a time zone, use the OffsetDateTime class.

ZoneOffset offset = ZoneOffset.ofHours( -7 );
OffsetDateTime odt = OffsetDateTime.now( offset );
String output1 = odt.toLocalTime().toString();
System.out.println( "Current time in " + offset + ": " + output1 );

Current time in -07:00: 19:41:36.525

If you have a full time zone, which is an offset plus a set of rules for handling anomalies such as Daylight Saving Time (DST), rather than a mere offset-from-UTC, use the ZonedDateTime class.

ZoneId denverTimeZone = ZoneId.of( "America/Denver" );
ZonedDateTime zdt = ZonedDateTime.now( denverTimeZone );
String output2 = zdt.toLocalTime().toString();
System.out.println( "Current time in " + denverTimeZone + ": " + output2 );

Current time in America/Denver: 20:41:36.560

See this code in action in Ideone.com.

Joda-Time

You can use Joda-Time 2.7 in Android. Makes date-time work much easier.

DateTimeZone zone = DateTimeZone.forID ( "America/Denver" );
DateTime dateTime = new DateTime ( zone );
String output = dateTime.toLocalTime ().toString ();

dump to console.

System.out.println ( "zone: " + zone + " | dateTime: " + dateTime + " | output: " + output );

When run…

zone: America/Denver | dateTime: 2016-07-11T20:50:17.668-06:00 | output: 20:50:17.668

Count Since Epoch

I strongly recommend against tracking by time by count-since-epoch. But if necessary, you can extract Joda-Time’s internal milliseconds-since-epoch (Unix time, first moment of 1970 UTC) by calling the getMillis method on a DateTime.

Note the use of the 64-bit long rather than 32-bit int primitive types.

In java.time. Keep in mind that you may be losing data here, as java.time holds a resolution up to nanoseconds. Going from nanoseconds to milliseconds means truncating up to six digits of a decimal fraction of a second (3 digits for milliseconds, 9 for nanoseconds).

long millis = Instant.now ().toEpochMilli ();

In Joda-Time.

long millis = DateTime.now( denverTimeZone ).getMillis();

Solution 4

Set the timezone to formatter, not calendar:

public String getTime(String timezone) {
    Calendar c = Calendar.getInstance();
    Date date = c.getTime(); //current date and time in UTC
    SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
    df.setTimeZone(TimeZone.getTimeZone(timezone)); //format in given timezone
    String strDate = df.format(date);
    return strDate;
}

Solution 5

Try this:

SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
df.setTimeZone(TimeZone.getTimeZone("YOUR_TIMEZONE"));
String strDate = df.format(date);

YOUR_TIMEZONE may be something like: GMT, UTC, GMT-5, etc.

Share:
53,233

Related videos on Youtube

Vishesh Joshi
Author by

Vishesh Joshi

Updated on July 09, 2022

Comments

  • Vishesh Joshi
    Vishesh Joshi almost 2 years

    I am new to Android and I am currently facing an issue to get current time given the timezone.

    I get timezone in the format "GMT-7" i.e. string. and I have the system time.

    Is there a clean way to get the current time in the above given timezone? Any help is appreciated. Thanks,

    edit : Trying to do this :

    public String getTime(String timezone) {
        Calendar c = Calendar.getInstance();
        c.setTimeZone(TimeZone.getTimeZone(timezone));
        Date date = c.getTime();
        SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        String strDate = df.format(date);
        return c.getTime().toString();
    }
    
    • Basil Bourque
      Basil Bourque almost 8 years
      By “current time” you mean the time-of-day without a date, or did you mean a date-only as seen your example SimpleDateFormat, or did you mean a date-time as seen in that last line with return?
  • Vishesh Joshi
    Vishesh Joshi about 11 years
    It doesn't work for me. I tried GMT+5 , GMT+7. but it keeps giving me current time in my timezone and not the one that I pass.
  • Flávio Faria
    Flávio Faria about 11 years
    If you're planning to return c.getTime().toString() you don't need the DateFormat stuff.
  • Flávio Faria
    Flávio Faria about 11 years
    Sorry, c.getTime() won't pass the timezone to the Date object. Try c.toString().
  • Basil Bourque
    Basil Bourque over 10 years
    You should refer to time zones by name rather than 3-letter codes or offset number. The 3-letter codes are not standardized, and many duplicates. If you use a name rather than an offset, your date-time library may assist with Daylight Saving Time and other anomalies. See this list of names.
  • basickarl
    basickarl over 9 years
    How do I get this in milliseconds?
  • Basil Bourque
    Basil Bourque over 9 years
    @KarlMorrison Using a count of milliseconds is usually a bad idea (search StackOverflow for discussion), but if you insist see my edit.
  • Tulains Córdova
    Tulains Córdova about 8 years
    How do you get an actual Date instead of a String?
  • Tulains Córdova
    Tulains Córdova about 8 years
    How do you get an actual Date instead of a String?
  • Tulains Córdova
    Tulains Córdova about 8 years
    How do you get an actual Date instead of a String?
  • Narayana J
    Narayana J almost 8 years
    @BasilBourque, thanks. But unfortunately, I am unable to get past java.lang.IllegalArgumentException: The datetime zone id 'America/Denver' is not recognised when I followed your code example. This other answer did not help either...
  • Basil Bourque
    Basil Bourque almost 8 years
    @NarayanaJ I just now copied-pasted in Joda-Time code that I just now ran in Java 8 with Joda-Time library 2.9.4. Also, you should know that the Joda-Time team advises migration to java.time classes. I added entire section at the top showing how to do the same work in java.time. You can exercise that java.time code at Ideone.com.
  • Prince Bhatti
    Prince Bhatti almost 8 years
    This will work only fro 5:30 time zone. What would be the solution if we want the app to pick the time zone specified in his phone settings? Like: If someone from Russia opens the app , he should get the Russian time zone.
  • Hammad Nasir
    Hammad Nasir over 7 years
    @COSTA you can use TimeZone timeZone = TimeZone.getDefault(); to get the TimeZone of the location where your app is running.
  • Prashanth Debbadwar
    Prashanth Debbadwar over 7 years
    Non of the above methods work if the device(mobile/system) time is wrong. How to get correct time thought system time is wrong?
  • Basil Bourque
    Basil Bourque over 7 years
    @PrashanthDebbadwar Asked and answered many times on Stack Overflow such as this and this and this. Please get in the habit of searching Stack Overflow, as it is intended to be more like Wikipedia and less like a discussion group.
  • Shashwat Gupta
    Shashwat Gupta about 7 years
    its returning the Device time, If user change the device time how can i get exact time from timeZone
  • KarthikKPN
    KarthikKPN over 6 years
    Since default is a keyword, use as TimeZone timezone = TimeZone.getDefault();
  • KZoNE
    KZoNE over 5 years
    @HammadNasir TimeZone.getDefault(); returns a string '+0530'. How can I format it as '+05:30' ?
  • Zakaria M. Jawas
    Zakaria M. Jawas over 5 years
    @HammadNasir if that always the case you can do TimeZome.getDefault().substring(0,3) + ":" + TimeZone.getDefault().substring(3);
  • Axay Prajapati
    Axay Prajapati about 5 years
    after setting time zone using given method, calender.getTime is giving desired Date instance. Thank you.