Получение времени по Гринвичу с Android

Я некоторое время копался в вопросе в StackOverflow Android получает текущее время в формате UTC и Как можно Я получаю текущую дату и время в формате UTC или GMT на Java?

Я попробовал два способа узнать текущее время своего телефона по Гринвичу. Я нахожусь в Испании, и разница составляет GMT + 2. Итак, давайте посмотрим на примере: 1º попытка: я создал формат и применил его к System.currentTimeMillis ();

    DateFormat dfgmt = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");   
    dfgmt.setTimeZone(TimeZone.getTimeZone("GMT")); 
    String gmtTime = dfgmt.format(new Date());
    //Using System.currentTimeMillis() is the same as new Date()
    Date dPhoneTime = dfgmt.parse(gmtTime);
    Long phoneTimeUTC = dPhoneTime.getTime();

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

    DateFormat df = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");          
    Date arrivalDate = df.parse(item.getArrivalDate());
    //the String comes from JSON and is for example:"UTC_arrival":"2011-05-16 18:00:00"
    //which already is in UTC format. So the DateFormat doesnt have the GMT paramater as dfgmt
    diff = arrival.getTime() - phoneTimeUTC ;

Я тоже пробовал это:

    Calendar aGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
    Long phoneTimeUTC = aGMTCalendar.getTimeInMillis()

И все же я не понимаю правильной разницы. Но если я сделаю это:

    Long phoneTimeUTC = aGMTCalendar.getTimeInMillis()-3600000*2;

Он работает нормально.

Любые идеи?

Большое спасибо,

Дэйвид.


person Dayerman    schedule 16.05.2011    source источник


Ответы (6)


Насколько я читал calendar.getTimeInMillis (); возвращает время UTC в миллисекундах. Я использовал следующий код и сравнил его с эпохой на этом сайте http://www.xav.com/time.cgi.

public int GetUnixTime()
{
    Calendar calendar = Calendar.getInstance();
    long now = calendar.getTimeInMillis();
    int utc = (int)(now / 1000);
    return (utc);

}

Гиора

person Giora    schedule 31.05.2011
comment
-1: getInstance() четко указано: Создает новый экземпляр подкласса Calendar, соответствующий языку по умолчанию и часовому поясу по умолчанию .. Вероятно, Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTimeInMillis() будет работать лучше - person Patrick Favre; 08.05.2015
comment
@patrickf Часовой пояс Calendar не имеет значения (не только потому, что мудрые программисты больше не используют Calendar), а также потому, что getTimeInMillis() возвращает одно и то же количество миллисекунд независимо от часового пояса. - person Ole V.V.; 30.03.2020
comment
@ OleV.V. Достаточно честно, не супер интуитивно понятный, но javadoc явно согласен с вашим утверждением - person Patrick Favre; 31.03.2020
comment
@patrickf Настоящая проблема / источник путаницы - это плохой дизайн класса Calendar, среди других проблем слишком много ответственности, вложенной в один класс. Мой ответ показывает способ вообще избежать использования этого класса. - person Ole V.V.; 31.03.2020

Это точно работает!

        SimpleDateFormat dateFormatGmt = new SimpleDateFormat("dd:MM:yyyy HH:mm:ss");
        dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
        System.out.println(dateFormatGmt.format(new Date())+"");

Укажите формат, и вы получите его в GMT!

person nithinreddy    schedule 17.04.2012

     Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
     Date currentLocalTime = cal.getTime();
     DateFormat date = new SimpleDateFormat("dd-MM-yyy HH:mm:ss z");   
     date.setTimeZone(TimeZone.getTimeZone("GMT")); 
     String localTime = date.format(currentLocalTime); 
     System.out.println(localTime);

Посмотрите, работает ли это.

person Vade    schedule 16.05.2011
comment
Должен ли я получить currentLocaltime с помощью String localTime = date.format (new Date ()); правильно?? - person Dayerman; 16.05.2011
comment
Я использовал этот «код» DateFormat dfgmt = new java.text.SimpleDateFormat (dd-MM-yyyy HH: mm: ss Z); dfgmt.setTimeZone (TimeZone.getTimeZone (GMT)); Строка gmtTime = dfgmt.format (новая Дата (). GetTime ()); Дата dPhoneTime = dfgmt.parse (gmtTime); Long phoneTime = dPhoneTime.getTime (); 'код' и все равно не повезло - person Dayerman; 16.05.2011
comment
Календарь cal = Calendar.getInstance (TimeZone.getTimeZone (GMT)); cal.add (Calendar.SECOND, 0); Дата currentLocalTime = cal.getTime (); DateFormat date = new SimpleDateFormat (дд-ММ-ггг ЧЧ: мм: сс г); date.setTimeZone (TimeZone.getTimeZone (GMT)); Строка localTime = date.format (currentLocalTime); System.out.println (локальное время); Я только что запустил это, и, похоже, у меня все работает нормально, я нахожусь в Великобритании, поэтому я изменил его на EST для тестирования, и мне кажется, что все в порядке - person Vade; 16.05.2011
comment
Привет, Вейд, я ищу не localTime, а время UTC. Если в Испании сейчас 12.25, я хочу получить 10.25. с вашим кодом я все еще получаю местное время. - person Dayerman; 16.05.2011
comment
@ Dayerman, извините, я немного смущен тем, что вы имеете в виду, приведенный выше код (отредактированный ответ) возвращает на моем компьютере текущее время GMT или UTC -0. Я несколько раз пытался настроить часовой пояс своего компьютера на utc + 3 или utc-2, каждый раз, когда я запускаю код, он по-прежнему возвращает правильное время по Гринвичу. например, в настоящее время в Великобритании (летнее время) 11:30, поэтому utc = 10:30, если я изменяю время на utc + 3, оно становится 14:30, но все еще выполняется этот код, возвращает 10:30 - person Vade; 16.05.2011
comment
Привет, Вейд, я все еще не могу получить время в формате UTC, но у меня есть еще две строки, чтобы получить миллисекунды, которые могут изменить время на местное время. 'Code' Date dPhoneTimeUTC = dfgmt.parse (localTime); Long phoneTime = dPhoneTimeUTC.getTime (); 'code' И еще я запускаю код на моем телефоне, но я думаю, что он такой же, как и на компьютере. - person Dayerman; 16.05.2011
comment
@dayerman Я ухожу на обед с женой через 5 минут, когда я вернусь, если вы не нашли решения, я взломал мой андроид на мой компьютер и запустил быстрое приложение, чтобы проверить его. но насколько я могу судить, он должен нормально работать на обоих. вы знаете, что текущее время UTC - GMT -1? - person Vade; 16.05.2011
comment
Спасибо, Вейд. В Испании текущее всемирное координированное время летом - GMT +2, остальное время года - GMT + 1. - person Dayerman; 16.05.2011
comment
Было бы здорово, если бы вы смогли пройти тест, как я. Например. у вас есть строка с 30-минутным опережением местного времени в UTC, например, теперь 13.00 GMT + 2 (в вашем случае 12.00 GMT-1), поэтому у вас есть String date = 2011-05-19 11:30:00, проанализируйте ее и затем вы получаете currentTime с телефона (11:00 UTC), переходите к UTC и diff = date - phoneUTC = 30 мин. Если бы вы могли это получить, это было бы великолепно;) - person Dayerman; 16.05.2011

вы всегда можете использовать:

Calendar mCalendar = Calendar.getInstance(TimeZone.getTimeZone("gmt"));
long millies = mCalendar.getTimeInMillis();

or

Calendar mCalendar = Calendar.getInstance(TimeZone.getTimeZone("utc"));
long millies = mCalendar.getTimeInMillis();
person alexm    schedule 04.07.2014

Вывод: 1 августа 2016 г., 14:37:48 UTC

    final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
    dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

Отлично работает.

person Ramdhas    schedule 03.08.2016
comment
Но как система узнает, из какого часового пояса находится мой объект Date? Что, если я хочу преобразовать дату из часового пояса +2 в GMT или наоборот? - person Dr. Failov; 02.07.2017

java.time и ThreeTenABP

Даю современный ответ.

Чтобы узнать разницу в миллисекундах между временем по телефону в настоящее время - в Испании или в любом другом месте - и определенным временем в прошлом:

    // Example arrival time for the demonstration
    Instant arrival = Instant.parse("2020-02-29T12:34:56.789Z");
    Instant currentTime = Instant.now();
    long difference = ChronoUnit.MILLIS.between(arrival, currentTime);
    System.out.println("Difference is " + difference + " milliseconds");

Пример вывода:

Разница составляет 2610350731 миллисекунды.

Если вам нужна разница в секундах или какой-либо другой единице времени, просто используйте соответствующую константу перечисления из перечисления ChronoUnit вместо ChronoUnit.MILLIS.

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

Кстати, эпоха - это один четко определенный момент времени, она не зависит от часового пояса, она одинакова во всем мире. Следовательно, отсчет миллисекунд от эпохи до настоящего времени также одинаков во всех часовых поясах. Некоторые говорят, что этот счет всегда в UTC, потому что эпоха (обычно) определяется в UTC, как 1 января 1970 года в 00:00 UTC.

Вопрос. Разве для java.time не требуется Android API 26 уровня?

java.time прекрасно работает как на старых, так и на новых устройствах Android. Для этого требуется как минимум Java 6.

  • В Java 8 и новее, а также на новых устройствах Android (начиная с уровня API 26) современный API встроен.
  • В Java 6 и 7, отличных от Android, используйте ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
  • На (более старом) Android используйте Android-версию ThreeTen Backport. Он называется ThreeTenABP. И убедитесь, что вы импортировали классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

person Ole V.V.    schedule 30.03.2020