182

I want to get the time zone from the Android mobile when clicking a button.

Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62
asha v
  • 2,039
  • 2
  • 15
  • 9
  • 12
    TimeZone tz = TimeZone.getDefault(); String gmt1=TimeZone.getTimeZone(tz.getID()).getDisplayName(false,TimeZone.SHORT); String gmt2=TimeZone.getTimeZone(tz.getID()).getDisplayName(false,TimeZone.LONG); Log.d("Tag","TimeZone : "+gmt1+"\t"+gmt2); And this is the code – asha v Oct 07 '11 at 09:45
  • 10
    I wouldn't be so rough on asha v. I was just looking for the same thing and the answers I found were different than these ones. Actually searching by the exact "TimeZone.getDefault" led me here. – Yar May 29 '12 at 14:27

13 Answers13

235

Have you tried to use TimeZone.getDefault():

Most applications will use TimeZone.getDefault() which returns a TimeZone based on the time zone where the program is running.

Ref: http://developer.android.com/reference/java/util/TimeZone.html

Joshua Pinter
  • 45,245
  • 23
  • 243
  • 245
Tobias
  • 9,170
  • 3
  • 24
  • 30
157
TimeZone tz = TimeZone.getDefault();
System.out.println("TimeZone   "+tz.getDisplayName(false, TimeZone.SHORT)+" Timezone id :: " +tz.getID());

Output:

TimeZone GMT+09:30 Timezone id :: Australia/Darwin

Andrew Orobator
  • 7,978
  • 3
  • 36
  • 36
Sher Ali
  • 5,513
  • 2
  • 27
  • 29
21

Edit: corrected the case

TimeZone.getDefault()

chornge
  • 2,021
  • 3
  • 28
  • 37
jmj
  • 237,923
  • 42
  • 401
  • 438
17

I needed the offset that not only included day light savings time but as a numerial. Here is the code that I used in case someone is looking for an example.

I get a response of "3.5" (3:30') which is what I would expect in Tehran , Iran in winter and "4.5" (4:30') for summer .

I also needed it as a string so I could post it to a server so you may not need the last line.

for getting currect time zone :

TimeZone tz = TimeZone.getDefault();
Date now = new Date();
//Import part : x.0 for double number
double offsetFromUtc = tz.getOffset(now.getTime()) / 3600000.0;
String m2tTimeZoneIs = Double.parseDouble(offsetFromUtc);
Adnan Abdollah Zaki
  • 4,328
  • 6
  • 52
  • 58
14

ZoneId from java.time and ThreeTenABP

Modern answer:

    ZoneId zone = ZoneId.systemDefault();
    System.out.println(zone);

When I ran this snippet in Australia/Sydney time zone, the output was exactly that:

Australia/Sydney

If you want the summer time (DST) aware time zone name or abbreviation:

    DateTimeFormatter longTimeZoneFormatter = DateTimeFormatter.ofPattern("zzzz", Locale.getDefault());
    String longTz = ZonedDateTime.now(zone).format(longTimeZoneFormatter);
    System.out.println(longTz);
    
    DateTimeFormatter shortTimeZoneFormatter = DateTimeFormatter.ofPattern("zzz", Locale.getDefault());
    String shortTz = ZonedDateTime.now(zone).format(shortTimeZoneFormatter);
    System.out.println(shortTz);
Eastern Summer Time (New South Wales)
EST

The TimeZone class used in most of the other answers was what we had when the question was asked in 2011, even though it was poorly designed. Today it’s long outdated, and I recommend that instead we use java.time, the modern Java date and time API that came out in 2014.

Question: Doesn’t java.time require Android API level 26?

java.time works nicely on both older and newer Android devices. It just requires at least Java 6.

  • In Java 8 and later and on newer Android devices (from API level 26) the modern API comes built-in.
  • In non-Android Java 6 and 7 get the ThreeTen Backport, the backport of the modern classes (ThreeTen for JSR 310; see the links at the bottom).
  • Edit: On (older) Android usually, as long as you're on Android Gradle plugin 4.0 or newer, with coreLibraryDesugaring you can use java.time directly. ThreeTenABP is no longer needed. (Previous bullet: use the Android edition of ThreeTen Backport. It’s called ThreeTenABP. And make sure you import the date and time classes from org.threeten.bp with subpackages.)

Links

Ole V.V.
  • 81,772
  • 15
  • 137
  • 161
  • 2
    Update to the API level 26 question. ThreeTenABP is no longer needed, usually, as long as you're on Android Gradle plugin 4.0 or newer. With `coreLibraryDesugaring` you can use java.time directly. – Jonik Mar 18 '21 at 10:25
14

Try this code-

Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();

It will return user selected timezone.

anujprashar
  • 6,263
  • 7
  • 52
  • 86
  • 4
    Creating a `Calendar` object for this is a nonsense. The creation of this type of object is expensive. `TimeZone.getDefault()` is the appropriate way to get this. – anonymous Apr 06 '13 at 09:41
  • 3
    @KrLx_roller Please check carefully before downvoting answer. I have wrtitten my answer returns user selected timezone whereas TimeZone.getDefault() will return installation default time zone. For more info please http://code.google.com/p/android/issues/detail?id=2037. – anujprashar Apr 08 '13 at 10:35
  • Your code returns the same timezone as TimeZone.getDefault() on android 4.2. TimeZone.getDefault() will return the timezone selected in settings -> date & time. – idunno Nov 06 '13 at 14:51
11
TimeZone timeZone = TimeZone.getDefault(); 
timeZone.getID();

It will print like

Asia/Kolkata
Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62
Raja Jawahar
  • 6,742
  • 9
  • 45
  • 56
5

On my device, TimeZone.getDefault() is always returning the UTC time zone.

I need to do this to get the user-configured time zone:

TimeZone.setDefault(null)
val tz = TimeZone.getDefault()

It will return the user-selected time zone.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Bipi
  • 3,429
  • 1
  • 20
  • 22
  • Was searching for hours, why `TimeZone.getDefault()` returns UTC always. Thanks for a solution. – Lybrica Apr 14 '23 at 10:15
3

Simplest Solution With Simple Date Format: SimpleDateFormat("ZZZZZ"):

 Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"),
                Locale.getDefault());
        Date currentLocalTime = calendar.getTime();

        DateFormat date = new SimpleDateFormat("ZZZZZ",Locale.getDefault());
        String localTime = date.format(currentLocalTime);
        System.out.println(localTime+ "  TimeZone   " );

==> Output is : +05:30

Jaydeep purohit
  • 1,536
  • 17
  • 20
3

All the answers here seem to suggest setting the daylight parameter to false. This is incorrect for many time zones which change abbreviated names depending on the time of the year (e.g., EST vs. EDT).

The solution below will give you the correct abbreviation according to the current date for the time zone.

val tz = TimeZone.getDefault()
val isDaylight = tz.inDaylightTime(Date())
val timezone = tz.getDisplayName(isDaylight, TimeZone.SHORT)
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
DummyData
  • 645
  • 9
  • 14
2

According to http://developer.android.com/reference/android/text/format/Time.html you should be using Time.getCurrentTimezone() to retrieve the current timezone of the device.

Thom
  • 14,013
  • 25
  • 105
  • 185
1

For devices with API 26 and higher, you can get it like this:

ZonedDateTime.now().getZone().toString();
Maciej Beimcik
  • 3,218
  • 1
  • 24
  • 26
1

I have spent some time to find the right answer. But it seems it works strangely on Android SDK. My device always returns 'UTC' as a timezoneId, and 0 as a timezone offset. But you can try to use headless WebView and fetch the timezone from there by JS. After this, you can save it into SharedPreference(TimeZone.setDefault() also works strangely)

class HeadlessWebViewUtil constructor(context: Context) {
    val webView = WebView(context)
    val jsInterface = MyJavaScriptInterface()

    fun fetch() {
        webView.settings.javaScriptEnabled = true
        webView.addJavascriptInterface(jsInterface, "android")
        webView.loadUrl("javascript:android.onTimezoneFetched(Intl.DateTimeFormat().resolvedOptions().timeZone)")
    }

    inner class MyJavaScriptInterface {
        @JavascriptInterface
        public fun onTimezoneFetched(timezoneId: String) {
            Timber.d("Timezone fetched: $timezoneId")
        }
    }
}

// And fetch
val wv = HeadlessWebViewUtil(this, timeZoneManager)
wv.fetch()