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();
}
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));
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();
Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
Log.d("Time zone","="+tz.getDisplayName());
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.
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;
}
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;
}
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
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));
Cleanest way is with SimpleDateFormat
SimpleDateFormat = SimpleDateFormat("MMM\nd\nh:mm a", Locale.getDefault())
or you can specify the Locale
来源:https://stackoverflow.com/questions/16202956/get-current-time-in-a-given-timezone-android