Получить текущее время в заданном часовом поясе: андроид
Я новичок в 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())
или вы можете указать локаль