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