Как получить смещение часовой пояс в GMT (как GMT + 7: 00) с устройства Android?
Я получаю timezone
устройства Android с помощью этого кода
TimeZone tz = TimeZone.getDefault();
String current_Time_Zone = (TimeZone.getTimeZone(tz.getID()).getDisplayName(
false, TimeZone.SHORT))
Но он всегда возвращает мне timezone
как "IST
", но я хочу получить часовой пояс в GMT
, как этот GMT+7:00.
Ответы
Ответ 1
Этот код возвращает мне смещение по часовой стрелке.
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"),
Locale.getDefault());
Date currentLocalTime = calendar.getTime();
DateFormat date = new SimpleDateFormat("Z");
String localTime = date.format(currentLocalTime);
Он возвращает смещение часового пояса следующим образом: +0530
Если мы используем SimpleDateFormat ниже
DateFormat date = new SimpleDateFormat("z",Locale.getDefault());
String localTime = date.format(currentLocalTime);
Он возвращает смещение часового пояса следующим образом: GMT + 05: 30
Ответ 2
Это может дать вам представление о том, как реализовать его по своему усмотрению:
Calendar mCalendar = new GregorianCalendar();
TimeZone mTimeZone = mCalendar.getTimeZone();
int mGMTOffset = mTimeZone.getRawOffset();
System.out.printf("GMT offset is %s hours", TimeUnit.HOURS.convert(mGMTOffset, TimeUnit.MILLISECONDS));
(TimeUnit - это "java.util.concurrent.TimeUnit" )
Ответ 3
Вот решение получить смещение часового пояса в GMT + 05: 30 в этом формате
public String getCurrentTimezoneOffset() {
TimeZone tz = TimeZone.getDefault();
Calendar cal = GregorianCalendar.getInstance(tz);
int offsetInMillis = tz.getOffset(cal.getTimeInMillis());
String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000), Math.abs((offsetInMillis / 60000) % 60));
offset = "GMT"+(offsetInMillis >= 0 ? "+" : "-") + offset;
return offset;
}
Ответ 4
public static String timeZone()
{
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.getDefault());
String timeZone = new SimpleDateFormat("Z").format(calendar.getTime());
return timeZone.substring(0, 3) + ":"+ timeZone.substring(3, 5);
}
возвращается как +03: 30
Ответ 5
однострочное решение - использовать символ Z
например:
new SimpleDateFormat(pattern, Locale.getDefault()).format(System.currentTimeMillis());
где pattern
может быть:
- Z/ZZ/ZZZ: -0800
- ZZZZ: GMT -08: 00
- ZZZZZ: -08: 00
полная ссылка здесь:
http://developer.android.com/reference/java/text/SimpleDateFormat.html
Ответ 6
public static String getCurrentTimezoneOffset() {
TimeZone tz = TimeZone.getDefault();
Calendar cal = GregorianCalendar.getInstance(tz);
int offsetInMillis = tz.getOffset(cal.getTimeInMillis());
String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000), Math.abs((offsetInMillis / 60000) % 60));
offset = (offsetInMillis >= 0 ? "+" : "-") + offset;
return offset;
}
Ответ 7
TimeZone tz = TimeZone.getDefault();
Calendar cal = GregorianCalendar.getInstance(tz);
int offsetInMillis = tz.getOffset(cal.getTimeInMillis());
String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000), Math.abs((offsetInMillis / 60000) % 60));
offset = (offsetInMillis >= 0 ? "+" : "-") + offset;
Ответ 8
Еще одно решение для получения смещения часового пояса:
TimeZone tz = TimeZone.getDefault();
String current_Time_Zone = getGmtOffsetString(tz.getRawOffset());
public static String getGmtOffsetString(int offsetMillis) {
int offsetMinutes = offsetMillis / 60000;
char sign = '+';
if (offsetMinutes < 0) {
sign = '-';
offsetMinutes = -offsetMinutes;
}
return String.format("GMT%c%02d:%02d", sign, offsetMinutes/60, offsetMinutes % 60);
}
Ответ 9
Если кто-то смотрит, как представлять GMT как число с плавающей точкой, представляющее смещение часа
(например," GMT-0530" -5,5), вы можете использовать это:
Calendar calendar = new GregorianCalendar();
TimeZone timeZone = calendar.getTimeZone();
int offset = timeZone.getRawOffset();
long hours = TimeUnit.MILLISECONDS.toHours(offset);
float minutes = (float)TimeUnit.MILLISECONDS.toMinutes(offset - TimeUnit.HOURS.toMillis(hours)) / MINUTES_IN_HOUR;
float gmt = hours + minutes;
Ответ 10
TimeZone timeZone = TimeZone.getDefault();
String timeZoneInGMTFormat = timeZone.getDisplayName(false,TimeZone.SHORT);
Выход: GMT + 5: 30
Ответ 11
Вы можете сделать следующее:
TimeZone tz = TimeZone.getDefault();
int offset = tz.getRawOffset();
String timeZone = String.format("%s%02d%02d", offset >= 0 ? "+" : "-", offset / 3600000, (offset / 60000) % 60);
Ответ 12
TimeZone tz = TimeZone.getDefault();
String gmt1=TimeZone.getTimeZone(tz.getID())
.getDisplayName(false,TimeZone.SHORT);
String gmt2=TimeZone.getTimeZone(tz.getID())
.getDisplayName(false,TimeZone.LONG); Log.d("Tag","TimeZone : "+gmt1+"\t"+gmt2);
Посмотрите, поможет ли это:)
Ответ 13
Я наткнулся на простое решение для этого в Java8 (не Android), используя класс ZoneDateTime
. Могут быть другие классы, которые реализуют интерфейс TemporalAccessor
, который работает, но я их не нашел. Насколько мне известно, это не будет работать со стандартными классами Date
, DateTime
, LocalDateTime
и Calender
.
ZoneOffset myOffset = ZonedDateTime.now().getOffset();
ZoneOffset myOffset2 = ZoneOffset.from(ZonedDateTime.now());
log.info("ZoneOffset is " + myOffset.getId()); // should print "+HH:MM"
log.info("ZoneOffset2 is " + myOffset2.getId()); // should print "+HH:MM"
Самое приятное в этом решении заключается в том, что он позволяет избежать множества математических выражений, генерации строк и синтаксического анализа.
Ответ 14
Вот как Google рекомендует получить TimezoneOffset.
Calendar calendar = Calendar.getInstance(Locale.getDefault());
int offset = -(calendar.get(Calendar.ZONE_OFFSET) + calendar.get(Calendar.DST_OFFSET)) / (60 * 1000)
https://developer.android.com/reference/java/util/Date#getTimezoneOffset()
Ответ 15
Я тоже смотрел на это и пытался выяснить, как применять часовой пояс и DST. Вот мой код.
public long applyGMTOffsetDST(long time) {
// Works out adjustments for timezone and daylight saving time
Calendar mCalendar = new GregorianCalendar();
TimeZone mTimeZone = mCalendar.getTimeZone();
boolean dstBool = mTimeZone.getDefault().inDaylightTime( new Date() );
// add an hour if DST active
if (dstBool == true) {
time = time + secondsPerHour;
}
// add offest hours
int mGMTOffset = mTimeZone.getRawOffset();
if (mGMTOffset > 0) {
long offsetSeconds = secondsPerHour * mGMTOffset;
time = time + offsetSeconds;
}
return time;
}
Это похоже на работу, но есть ли лучший способ получить фактическое время с устройства, которое представляет собой время, которое имеет смысл и точность для пользователя?
Ответ 16
Добавление смещения dst решит это:
int offsetInMillis = TimeZone.getDefault().getRawOffset()+TimeZone.getDefault().getDSTSavings();
String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000), Math.abs((offsetInMillis / 60000) % 60));
offset = (offsetInMillis >= 0 ? "+" : "-") + offset;
return offset;
Ответ 17
Используйте этот код (опция 1):
//Opt 1
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"),
Locale.getDefault());
Date currentLocalTime = calendar.getTime();
DateFormat date = new SimpleDateFormat("Z", Locale.getDefault());
String localTime = date.format(currentLocalTime);
String finalTimezone = String.format("GMT%s:%s", localTime.substring(0, 3), localTime.substring(3));
Log.d(TAG, "timezone 1: " + finalTimezone);
//Opt 2
date = new SimpleDateFormat("z",Locale.getDefault());
localTime = date.format(currentLocalTime);
Log.d(TAG, "timezone 2: "+localTime);
//Opt 3
TimeZone tz = TimeZone.getDefault();
Log.d(TAG, "timezone 3: "+tz.getDisplayName(true, TimeZone.SHORT));
//
Если я в Лос-Анджелесе (по стандартному тихоокеанскому времени GTM-07: 00), то вывод:
timezone 1: GMT-07:00
timezone 2: PDT
timezone 3: PDT
Ответ 18
Чтобы получить дату и время со смещением, например 2019-07-22T13:39:27.397+05:00
Попробуйте следующий код Котлина:
fun getDateTimeForApiAsString() : String{
val date = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX",
Locale.getDefault())
return date.format(Date())
}
Выходной формат:
2019-07-22T13:39:27.397+05:00 //for Pakistan
Если вы хотите, чтобы другие похожие форматы заменили шаблон в SimpleDateFormat
как SimpleDateFormat
ниже:
"yyyy.MM.dd G 'at' HH:mm:ss z" //Output Format: 2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy" //Output Format: Wed, Jul 4, '01
"h:mm a" //Output Format: 12:08 PM
"hh 'o''clock' a, zzzz" //Output Format: 12 o'clock PM, Pacific Daylight Time
"K:mm a, z" //Output Format: 0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa" //Output Format: 02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z" //Output Format: Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ" //Output Format: 010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ" //Output Format: 2001-07-04T12:08:56.235-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX" //Output Format: 2001-07-04T12:08:56.235-07:00
"YYYY-'W'ww-u" //Output Format: 2001-W27-3
Ответ 19
Вы можете получить свое время по Гринвичу из этой функции отсюда
public static String getCurrentDate() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy MM dd hh:mm a zzz");
Date date = new Date();
sdf.setTimeZone(TimeZone.getTimeZone("GMT+6:00"));
return sdf.format(date);
}
Ответ 20
Обычно вы не можете переводить из часового пояса, например, Азия/Калькутта, в смещение по Гринвичу, например, +05: 30 или +07: 00. Часовой пояс, как следует из названия, - это место на земле, которое включает в себя исторические, настоящие и известные будущие смещения UTC, используемые людьми в этом месте (сейчас мы можем рассматривать GMT и UTC как синонимы, строго говоря, нет), Например, Азия/Калькутта находились в смещении +05: 30 с 1945 года. В периоды между 1941 и 1945 годами было +06: 30, а до этого времени - +05: 53: 20 (да, с точностью до секунд). Многие другие часовые пояса имеют летнее время (летнее время, летнее время) и меняют свое смещение два раза в год.
Однако, учитывая момент времени, мы можем сделать перевод для этого конкретного момента времени. Я хотел бы предоставить современный способ сделать это.
java.time и ThreeTenABP
ZoneId zone = ZoneId.of("Asia/Kolkata");
ZoneOffset offsetIn1944 = LocalDateTime.of(1944, Month.JANUARY, 1, 0, 0)
.atZone(zone)
.getOffset();
System.out.println("Offset in 1944: " + offsetIn1944);
ZoneOffset offsetToday = OffsetDateTime.now(zone)
.getOffset();
System.out.println("Offset now: " + offsetToday);
Выход при запуске только сейчас был:
Offset in 1944: +06:30
Offset now: +05:30
По времени по умолчанию установленной зоны в zone
до ZoneId.systemDefault()
.
Для форматирования смещения с помощью текста GMT
используйте форматер с OOOO
(четыре заглавные буквы O) в шаблоне:
DateTimeFormatter offsetFormatter = DateTimeFormatter.ofPattern("OOOO");
System.out.println(offsetFormatter.format(offsetToday));
GMT +05: 30
Я рекомендую и в своем коде я использую java.time, современный Java-интерфейс даты и времени. TimeZone
, Calendar
, Date
, SimpleDateFormat
и DateFormat
используемые во многих других ответах, плохо разработаны и в настоящее время устарели, поэтому я предлагаю избегать их всех.
Вопрос: Могу ли я использовать java.time на Android?
Да, java.time прекрасно работает на старых и новых устройствах Android. Это просто требует как минимум Java 6.
- В Java 8 и более поздних версиях, а также на более новых устройствах Android (начиная с уровня API 26) встроен современный API.
- В Java 6 и 7 получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
- На (более старом) Android используйте Android-версию ThreeTen Backport. Его называют ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
с подпакетами.
связи
Ответ 21
TimeZone timeZone = TimeZone.getTimeZone( "GMT + 7: 00" );
объявить его явно.