Reputation: 2109
I want to get the time zone from the Android mobile when clicking a button.
Upvotes: 189
Views: 203924
Reputation: 117
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()
Upvotes: 2
Reputation: 682
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)
Upvotes: 5
Reputation: 3589
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.
Upvotes: 6
Reputation: 86399
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.
java.time works nicely on both older and newer Android devices. It just requires at least Java 6.
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.)java.time
was first described.java.time
to Java 6 and 7 (ThreeTen for JSR-310).Upvotes: 15
Reputation: 5793
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
Upvotes: 161
Reputation: 6972
TimeZone timeZone = TimeZone.getDefault();
timeZone.getID();
It will print like
Asia/Kolkata
Upvotes: 12
Reputation: 3348
For devices with API 26 and higher, you can get it like this:
ZonedDateTime.now().getZone().toString();
Upvotes: 1
Reputation: 1566
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
Upvotes: 3
Reputation: 4406
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);
Upvotes: 17
Reputation: 15102
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.
Upvotes: 2
Reputation: 9380
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
Upvotes: 246
Reputation: 6335
Try this code-
Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
It will return user selected timezone.
Upvotes: 14