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

Я новичок в 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();
}

Ответ 1

У меня это получилось так:

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

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

Кстати, никогда не ссылайтесь на offset-from-UTC с одной цифрой часов, например -7, так как является нестандартным и будет несовместимым с различными протоколами и библиотеками. Всегда заполняйте ноль для второй цифры, например -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-Time 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 );

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

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

Count с Epoch

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

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

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

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

В Йода-Время.

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

Ответ 3

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

Ответ 4

Попробуйте следующее:

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

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

Ответ 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;
}

Ответ 6

Да, вы можете. Посредством вызова метода TimeZone 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;
}

Ответ 7

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

Сначала установите часовой пояс приложения, используя

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

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

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

Это даст текущее время в зависимости от часового пояса.

D/Los angeles time: чт 21 июня 13:52:25 PDT 2018

Ответ 8

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

Ответ 9

Самый простой способ с SimpleDateFormat

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

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