Почему GMT является стандартом для компьютерного времени вместо UTC? - PullRequest
6 голосов
/ 20 января 2012

Мне кажется, что везде, где я видел алгоритмы, связанные со временем, в программировании, GMT было базовым временем. Например, мне сказали всегда сохранять время в БД в GMT + 00, чтобы изменения часового пояса ничего не нарушали.

  1. Прав ли я, что GMT кажется базовым часовым поясом при разработке программного обеспечения?

  2. Если так, то почему не UTC? Почему не принято говорить «UTC + 01» вместо «GMT + 01», учитывая, что даже метки времени Unix определены из UTC (http://en.wikipedia.org/wiki/Unix_time)

Ответы [ 5 ]

7 голосов
/ 20 января 2012

GMT и UTC - это одно и то же время.Время UNIX основано на UTC, поэтому вы можете обнаружить, что это больше в системах UNIX и * nix.

UTC также более точно отслеживается как официальное время (то есть более точно соответствует «истинному» времениот вращения Земли).Но если вашему программному обеспечению не требуются расчеты с точностью до секунды, то не имеет значения, используете ли вы GMT или UTC.

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

3 голосов
/ 18 июня 2016

Я подумал, что было бы интересно узнать, какие часовые пояса IANA в настоящее время используют аббревиатуру "GMT", как сейчас, так и через 6 месяцев (чтобы поймать тех, кто в настоящее время работает в летнее время).

Используя эту бесплатную библиотеку C ++ 11/14 с открытым исходным кодом , я написал эту программу:

#include "tz.h"
#include <string>
#include <iostream>
#include <vector>

template <class Duration>
std::vector<date::zoned_time<std::common_type_t<Duration, std::chrono::seconds>>>
find_by_abbrev(date::sys_time<Duration> tp, const std::string& abbrev)
{
    using namespace std::chrono;
    using namespace date;
    std::vector<zoned_time<std::common_type_t<Duration, seconds>>> results;
    auto& db = get_tzdb();
    for (auto& z : db.zones)
    {
        if (z.get_info(tp).abbrev == abbrev)
            results.push_back(make_zoned(&z, tp));
    }
    return results;
}

int
main()
{
    using namespace std::chrono;
    using namespace date;
    auto now = system_clock::now();
    auto v = find_by_abbrev(now, "GMT");
    for (auto const& x : v)
        std::cout << format("%F %H:%M:%S %Z %z", x) << " "
                  << x.get_time_zone()->name() << '\n';
    std::cout << '\n';
    v = find_by_abbrev(now + months{6}, "GMT");
    for (auto const& x : v)
        std::cout << format("%F %H:%M:%S %Z %z", x) << " "
                  << x.get_time_zone()->name() << '\n';
}

Она ищет на планете все часовые пояса, которые в настоящее время используют "GMT".«и сейчас, и через 6 месяцев, и распечатывает их:

2016-06-18 01:00:25.632773 GMT +0000 Africa/Abidjan
2016-06-18 01:00:25.632773 GMT +0000 Africa/Accra
2016-06-18 01:00:25.632773 GMT +0000 Africa/Bissau
2016-06-18 01:00:25.632773 GMT +0000 Africa/Monrovia
2016-06-18 01:00:25.632773 GMT +0000 America/Danmarkshavn
2016-06-18 01:00:25.632773 GMT +0000 Atlantic/Reykjavik
2016-06-18 01:00:25.632773 GMT +0000 Etc/GMT

2016-12-17 15:55:01.632773 GMT +0000 Africa/Abidjan
2016-12-17 15:55:01.632773 GMT +0000 Africa/Accra
2016-12-17 15:55:01.632773 GMT +0000 Africa/Bissau
2016-12-17 15:55:01.632773 GMT +0000 Africa/Monrovia
2016-12-17 15:55:01.632773 GMT +0000 America/Danmarkshavn
2016-12-17 15:55:01.632773 GMT +0000 Atlantic/Reykjavik
2016-12-17 15:55:01.632773 GMT +0000 Etc/GMT
2016-12-17 15:55:01.632773 GMT +0000 Europe/Dublin
2016-12-17 15:55:01.632773 GMT +0000 Europe/London

Я был рад видеть, что во всех случаях смещение UTC было +0000.Вы никогда не знаете с политиками и часовыми поясами.Какой-то законодательный орган мог бы легко провозгласить «Время Зеленых гор» (а может и завтра).

2 голосов
/ 26 июня 2015

Этот принятый ответ на самом деле неверен. Во-первых, они не одинаковы в любом случае. Второй UTC НЕ более точно соответствует «истинному» времени, основанному на вращении Земли, с точностью до наоборот. UTC является более точным с точки зрения измерения времени. Каждая секунда длится одно и то же, поскольку основывается на атомном времени, а точность увеличивается с высотой (потребуется 30 тысяч лет, чтобы сместить одну секунду).

GMT вместо этого отслеживает вращение Земли, поскольку это не всегда одно и то же (вращение Земли замедляется), каждая секунда отличается. Конечно, отличается действительно небольшим количеством времени. Но в научных целях гораздо точнее UTC, чем по Гринвичу.

По этой причине UTC меняется на +2 секунды каждые 4/5 лет (поскольку вращение Земли медленнее, каждая секунда, необходимая для вращения, должна быть больше, чем UTC), поэтому оно следует времени вращения Земли по Гринвичу менее чем на секунду разницы.

1 голос
/ 17 июня 2016

GMT и UTC - это не одно и то же. Прочитайте https://en.wikipedia.org/wiki/Greenwich_Mean_Time и ссылку там на UTC для различий.

Некоторых пользователей компьютеров смущает тот факт, что до Windows 7 ни одна операционная система Microsoft полностью не поддерживала UTC и, таким образом, продолжала помечать международный часовой пояс как GMT.

Ключевой вопрос - как Windows считывает и устанавливает часы BIOS. Windows XP не справляется с настройкой часов BIOS на UTC, поэтому вы должны установить часы BIOX на местное время, а затем полагаться на Windows, отслеживающую разницу.

Начиная с Windows 7, Windows может обрабатывать установку часов BIOS на UTC и соответствует ли все вычисления (в основном?) UTC, поэтому Microsoft решила переключить метку с GMT на UTC.

См:

https://superuser.com/questions/185773/does-windows-7-support-utc-as-bios-time

1 голос
/ 20 января 2012

Я бы сказал, что это потому, что большинство людей привыкли к Гринвичу.Если вы собираетесь показывать информацию человеку, в частности время, вам нужен формат, который он может легко понять.Использование GMT ​​спасает вас от дополнительных шагов преобразования в UTC и обратно.

...