Получить текущее время в данном часовом поясе: андроид

Я новичок в Android, и в настоящее время я сталкиваюсь с проблемой, чтобы получить текущее время с учетом часового пояса.

Я получаю часовой пояс в формате "GMT-7", т. е. строку. и у меня есть системное время.

есть ли чистый способ получить текущее время в указанном выше часовом поясе? Любая помощь приветствуется. Спасибо,

изменить : Пытаясь сделать это:

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

9 ответов


Я заставил его работать так:

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.время

как старые классы даты-времени в комплекте с Java, так и сторонняя библиотека Joda-Time были заменены java.время фреймворк, встроенный в Java 8 и более поздние версии. Эти классы вытесняют старые хлопотные классы даты-времени, такие как java.util.Date. См.В Oracle Учебник. Большая часть java.функциональность времени обратно портирована на Java 6 & 7 в ThreeTen-Backport и далее адаптированы к Android в ThreeTenABP.

кстати, никогда не ссылайтесь на смещение от-UTC С одной цифрой часов, таких как -7, поскольку это нестандартно и будет несовместимо с различными протоколами и библиотеками. Всегда pad с нулем для второй цифры, например -07.

если у вас есть смещение, а не часовой пояс, используйте OffsetDateTime класса.

ZoneOffset offset = ZoneOffset.ofHours( -7 );
OffsetDateTime odt = OffsetDateTime.now( offset );
String output1 = odt.toLocalTime().toString();
System.out.println( "Current time in " + offset + ": " + output1 );

текущее время в -07: 00: 19:41:36.525

если у вас есть полный часовой пояс, который является смещением плюс набор правил для обработки аномалий, таких как летнее время (DST), а не просто смещение от-UTC, используйте ZonedDateTime класса.

ZoneId denverTimeZone = ZoneId.of( "America/Denver" );
ZonedDateTime zdt = ZonedDateTime.now( denverTimeZone );
String output2 = zdt.toLocalTime().toString();
System.out.println( "Current time in " + denverTimeZone + ": " + output2 );

текущее время в Америка/Денвер: 20:41:36.560

посмотреть этот код в действии в Ideone.com.

Joda Времени

вы можете использовать Joda Времени 2.7 в Android. Делает работу даты-времени гораздо легче.

DateTimeZone zone = DateTimeZone.forID ( "America/Denver" );
DateTime dateTime = new DateTime ( zone );
String output = dateTime.toLocalTime ().toString ();

дамп в консоли.

System.out.println ( "zone: " + zone + " | dateTime: " + dateTime + " | output: " + output );

при запуске...

зоны: Америка/Денвер | датавремя: 2016-07-11T20:50:17.668-06:00 | Выход: 20:50:17.668

Граф С Эпохи

я настоятельно рекомендую против отслеживание по времени по счету-с-эпохи. Но при необходимости вы можете извлечь Joda-Time внутренние миллисекунды-с-эпохи (Unix время, первый момент 1970 UTC), вызвав getMillis метод DateTime.

обратите внимание на использование 64-разрядного long, а не 32-бит int примитивные типы.

на java.время. Имейте в виду, что вы можете потерять данные, как Java.время держит разрешение до наносекунд. Переход от наносекунд к миллисекундам означает усечение до шести цифр десятичной доли секунды (3 цифры для миллисекунд, 9 для наносекунд).

long millis = Instant.now ().toEpochMilli ();

В Joda Времени.

long millis = DateTime.now( denverTimeZone ).getMillis();

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

попробуйте это:

SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
df.setTimeZone(TimeZone.getTimeZone("YOUR_TIMEZONE"));
String strDate = df.format(date);

YOUR_TIMEZONE может быть что-то вроде: GMT, UTC, GMT-5 и т. д.


установить часовой пояс для форматирования, а не календарь:

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

Да, вы можете. На зов часового пояса setDefault() метод.

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

Я нашел более простой способ.

первый установленный часовой пояс приложения с помощью

    TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));

а затем вызовите каландр, чтобы получить дату внутренне он использует часовой пояс по умолчанию, установленный выше через приложение.

     Calendar cal = Calendar.getInstance();
     Log.d("Los angeles time   ",cal.getTime().toString());

это даст текущее время на основе часового пояса.

D / Лос-Анджелес время: Чт июн 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 может быть одним из снизу в соответствии с вашим выбором

String[] ids=TimeZone.getAvailableIDs();

тогда время можно получить в соответствии с принятым ответом выше

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

самый чистый способ - с SimpleDateFormat

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

или вы можете указать Locale