Reputation: 1611
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();
}
Upvotes: 21
Views: 60589
Reputation: 2846
In Kotlin:
val mTime: Calendar = Calendar.getInstance()
val timeZone = TimeZone.getDefault().displayName // based on the device time zone it will calculate.
Output :
IST // it will return device time zone
Upvotes: 1
Reputation: 11900
// 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());
Upvotes: 14
Reputation: 362
One way to deal with time zone and milliseconds values:
val currentDateTime = Calendar.getInstance().apply {
timeZone?.let {
val tzCalendar = Calendar.getInstance(it)
this.set(Calendar.HOUR_OF_DAY, tzCalendar.get(Calendar.HOUR_OF_DAY))
this.set(Calendar.MINUTE, tzCalendar.get(Calendar.MINUTE))
}
}.time
This way you're getting time in milliseconds for the specific timezone.
Upvotes: 0
Reputation: 1611
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.
Upvotes: 24
Reputation: 2309
I found a better and simpler way.
First set time zone of app using
TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));
And then call Calander to get date internally it uses default timezone set by above through out app.
Calendar cal = Calendar.getInstance();
Log.d("Los angeles time ",cal.getTime().toString());
It will give current time based on time zone.
D/Los angeles time: Thu Jun 21 13:52:25 PDT 2018
Upvotes: 3
Reputation: 725
Cleanest way is with SimpleDateFormat
SimpleDateFormat = SimpleDateFormat("MMM\nd\nh:mm a", Locale.getDefault())
or you can specify the Locale
Upvotes: 0
Reputation: 6693
TimeZone tz = TimeZone.getTimeZone(TimeZoneID);
Calendar c= Calendar.getInstance(tz);
String time=new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date(cal.getTimeInMillis()));
TimeZoneID can be one of from below as per as your choice
String[] ids=TimeZone.getAvailableIDs();
then time can be get as per accepted answer above
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));
Upvotes: 1
Reputation: 1459
Yes, you can. By call TimeZone setDefault()
method.
public String getTime(String timezone) {
TimeZone defaultTz = TimeZone.getDefault();
TimeZone.setDefault(TimeZone.getTimeZone(timezone));
Calendar cal = Calendar.getInstance();
Date date = cal.getTime();
String strDate = date.toString();
// Reset Back to System Default
TimeZone.setDefault(defaultTz);
return strDate;
}
Upvotes: 5
Reputation: 340350
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.
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
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();
Upvotes: 12
Reputation: 563
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;
}
Upvotes: 9
Reputation: 6605
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.
Upvotes: 8