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

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

person Vishesh Joshi    schedule 24.04.2013    source источник
comment
Под «текущим временем» вы имели в виду время дня без даты, или вы имели в виду только дату, как показано в вашем примере SimpleDateFormat, или вы имели в виду дату и время, как показано в этой последней строке с return?   -  person Basil Bourque    schedule 12.07.2016


Ответы (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));

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

person Vishesh Joshi    schedule 24.04.2013
comment
Как получить настоящую дату вместо строки? - person Tulains Córdova; 02.05.2016
comment
Это будет работать только для часового пояса 5:30. Каким будет решение, если мы хотим, чтобы приложение выбирало часовой пояс, указанный в настройках его телефона? Типа: Если кто-то из России открывает приложение, он должен получить русский часовой пояс. - person Prince Bhatti; 17.09.2016
comment
@COSTA вы можете использовать TimeZone timeZone = TimeZone.getDefault();, чтобы получить часовой пояс места, где работает ваше приложение. - person Hammad Nasir; 14.11.2016
comment
он возвращает время устройства, если пользователь изменяет время устройства, как я могу получить точное время из часового пояса - person Shashwat Gupta; 19.05.2017
comment
@HammadNasir TimeZone.getDefault (); возвращает строку '+0530'. Как я могу отформатировать его как '+05: 30'? - person KZoNE; 13.03.2019
comment
@HammadNasir, если это всегда так, ты можешь сделать TimeZome.getDefault().substring(0,3) + ":" + TimeZone.getDefault().substring(3); - person Zakaria M. Jawas; 17.03.2019

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 с одной цифрой часов, например as -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-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-Since- эпоха. Но при необходимости вы можете извлечь внутренние миллисекунды с начала эпохи Joda-Time (Unix time, первый момент 1970 года по всемирному координированному времени), вызвав _ 10_ в DateTime .

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

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

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

В Джода-Тайм.

long millis = DateTime.now( denverTimeZone ).getMillis();
person Basil Bourque    schedule 28.11.2013
comment
Как мне получить это за миллисекунды? - person basickarl; 04.03.2015
comment
@KarlMorrison Использование счетчика миллисекунд - обычно плохая идея (найдите обсуждение в StackOverflow), но если вы настаиваете, посмотрите мою правку. - person Basil Bourque; 05.03.2015
comment
@BasilBourque, спасибо. Но, к сожалению, я не могу пройти мимо java.lang.IllegalArgumentException: The datetime zone id 'America/Denver' is not recognised, когда последовал примеру вашего кода. Этот другой ответ сделал тоже не помогает ... - person Narayana J; 12.07.2016
comment
@NarayanaJ Я только что скопировал-вставил код Joda-Time, который я только что запустил на Java 8 с библиотекой Joda-Time 2.9.4. Также вы должны знать, что команда Joda-Time советует перейти на классы java.time. Я добавил целый раздел вверху, показывающий, как проделать ту же работу в java.time. Вы можете использовать этот код java.time на Ideone.com. - person Basil Bourque; 12.07.2016
comment
Ни один из вышеперечисленных методов не работает, если время на устройстве (мобильном / системном) неверно. Как получить правильное время, если системное время неверно? - person Prashanth Debbadwar; 29.11.2016
comment
@PrashanthDebbadwar Много раз спрашивал и отвечал на Stack Overflow, например this и this и this. Пожалуйста, возьмите за привычку искать Stack Overflow, так как он больше похож на Википедию, а не на дискуссионную группу. - person Basil Bourque; 29.11.2016

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

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;
}
person igork    schedule 13.05.2015
comment
Как получить настоящую дату вместо строки? - person Tulains Córdova; 02.05.2016

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

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

YOUR_TIMEZONE может быть примерно таким: GMT, UTC, GMT-5 и т. Д.

person Flávio Faria    schedule 24.04.2013
comment
У меня это не работает. Я пробовал GMT + 5, GMT + 7. но он продолжает давать мне текущее время в моем часовом поясе, а не то, которое я прохожу. - person Vishesh Joshi; 25.04.2013
comment
Если вы планируете вернуть c.getTime().toString(), вам не нужны материалы DateFormat. - person Flávio Faria; 25.04.2013
comment
К сожалению, c.getTime() не передает часовой пояс объекту Date. Попробуйте c.toString(). - person Flávio Faria; 25.04.2013
comment
Вы должны ссылаться на часовые пояса по имени, а не по трехбуквенному коду или номеру смещения. Трехбуквенные коды не стандартизированы и имеют много дубликатов. Если вы используете имя, а не смещение, ваша библиотека даты и времени может помочь с переходом на летнее время и другими аномалиями. См. этот список имен. - person Basil Bourque; 28.11.2013
comment
Как получить настоящую дату вместо строки? - person Tulains Córdova; 02.05.2016

Да, ты можешь. Вызов метода 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;
}
person Tang Chanrith    schedule 24.03.2017
comment
Поскольку по умолчанию используется ключевое слово, используйте в качестве TimeZone timezone = TimeZone.getDefault (); - person KarthikKPN; 11.01.2018

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

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

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

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

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

Он покажет текущее время в зависимости от часового пояса.

Д / лос-анджелес, четверг, 21 июня, 13:52:25 по тихоокеанскому времени, 2018 г.

person Justcurious    schedule 21.06.2018
comment
после установки часового пояса с использованием данного метода calender.getTime предоставляет желаемый экземпляр Date. Спасибо. - person akki; 14.06.2019

 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));
person Rajesh Nasit    schedule 31.01.2018

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

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

или вы можете указать языковой стандарт

person Kyle    schedule 21.06.2018

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

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

Таким образом, вы получаете время в миллисекундах для определенного часового пояса.

person Goran Devs    schedule 30.01.2020