Подтвердить что ты не робот

Как получить смещение часовой пояс в 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.

4b9b3361

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

Самое приятное в этом решении заключается в том, что он позволяет избежать множества математических выражений, генерации строк и синтаксического анализа.

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

объявить его явно.