-->

Get current time in a given timezone : android

2019-01-11 13:56发布

问题:

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();
}

回答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));


回答2:

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();


回答3:

Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
Log.d("Time zone","="+tz.getDisplayName());


回答4:

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.



回答5:

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;
}


回答6:

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;
}


回答7:

 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));


回答8:

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 throught 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



回答9:

Cleanest way is with SimpleDateFormat

SimpleDateFormat = SimpleDateFormat("MMM\nd\nh:mm a", Locale.getDefault())

or you can specify the Locale