Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: часовой пояс в си  (Прочитано 1795 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн neon1ks

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1183
    • Просмотр профиля
    • Блог молодого разработчика
часовой пояс в си
« : 15 Января 2015, 23:00:36 »
Осенью придумал программку для определения часового пояса:
Код: (C) [Выделить]
#include <stdio.h>
#include <time.h>

int main (int argn, char *argv[]) {

int UTC;
time_t s_time, ctime1, ctime2;
struct tm * m_time;

s_time = time (NULL);

m_time = gmtime (&s_time);
ctime1 = mktime (m_time);

m_time = localtime (&s_time);
ctime2 = mktime (m_time);

UTC = (ctime2 - ctime1)/3600;
printf("UTC = %d\n", UTC);

return 0;
}

В системе менял часовой пояс и проверял, программа выдает верные результаты
sudo dpkg-reconfigure tzdata
Также позволяет определить часовой пояс в прошлом, например, если подставить вместо s_time = time (NULL);
s_time = 1410393600;Получим часовой пояс до осеннего перевода часов.

Есть еще забавная функция
Код: (C) [Выделить]
double difftime(time_t time2,time_t time1)
Во-первых, почему команда возвращает число в формате double? Когда результат всегда целое число =)
Во-вторых, в Windows данная функция не работает в MinGW.
« Последнее редактирование: 16 Января 2015, 00:08:04 от neon1ks »

Оффлайн FixNix

  • Участник
  • *
  • Сообщений: 208
    • Просмотр профиля
Re: часовой пояс в си
« Ответ #1 : 16 Января 2015, 13:12:49 »
Цитировать
Во-первых, почему команда возвращает число в формате double? Когда результат всегда целое число =)
Функция difftime() возвращает разность в секундах между временем time1 и временем time2, то есть она возвращает величину time2— time1.
Следовательно, почему в double? - возможно, потому что дает разность с точностью до миллисекунд.

Цитировать
Во-вторых, в Windows данная функция не работает в MinGW.
Говорят это баг. Похоже, связанный с разрядностью. В ссылках говорится как можно обойти этот баг.
« Последнее редактирование: 18 Января 2015, 03:18:15 от FixNix »
ubuntu 16.04 x64 - комп. на работе и ноут дома, Nautilus Nemo (2.8.7) для Unity.
Если хочешь сделать что-то хорошо, сделай это сам.

Оффлайн neon1ks

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1183
    • Просмотр профиля
    • Блог молодого разработчика
Re: часовой пояс в си
« Ответ #2 : 16 Января 2015, 14:41:26 »
FixNix,
time_t изменяется в секундах, значит и разность тоже может быть только в секундах.

Оффлайн FixNix

  • Участник
  • *
  • Сообщений: 208
    • Просмотр профиля
Re: часовой пояс в си
« Ответ #3 : 17 Января 2015, 20:21:06 »
neon1ks,
Да, верно. Значения в секундах. Похоже, что смысл использования double в том, что у него большой диапазон значения.

Я интересную для себя информацию нашёл, связанную с данной тематикой. Оказывается есть такая проблема как: Проблема 2038 года


Пример, показывающий сброс даты (в 03:14:08 UTC 19 января 2038 года).

Цитировать
Введение 64-битного формата вносит новую дату «закольцовывания» — оно произойдёт примерно через 290 миллиардов лет (в воскресенье, 4 декабря 292 277 026 596 года в 15:30:08).
ubuntu 16.04 x64 - комп. на работе и ноут дома, Nautilus Nemo (2.8.7) для Unity.
Если хочешь сделать что-то хорошо, сделай это сам.

Оффлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5743
  • Все по палатам!
    • Просмотр профиля
Re: часовой пояс в си
« Ответ #4 : 17 Января 2015, 21:59:40 »
/
Я интересную для себя информацию нашёл, связанную с данной тематикой. Оказывается есть такая проблема как: Проблема 2038 года
Все новое - давно забытое старое
Проблема 2000 года
И это переживем...
Извините, я все еще учусь

Оффлайн neon1ks

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1183
    • Просмотр профиля
    • Блог молодого разработчика
Re: часовой пояс в си
« Ответ #5 : 17 Января 2015, 22:40:32 »
SergeyIT,
Есть еще одна вещь, которую нужно учитывать
Формат времени time_t: в 32 битной системе занимает 4 байта, а в 64 битной - 8 байт. Аналогичная ситуация с форматом long.

И сейчас мне приходится, при сохранении времени в бинарный файл, время переводит в формат int. А считывать int, и затем уже переводит в формат time_t. Первоначально, просто в формате файла под время было выделено 4 байта... Так что мои программы пока имеют проблему 2038 года ;)

FixNix,
Да, кстати, про диапазон не подумал... Это вполне может объяснить почему double.

Оффлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5743
  • Все по палатам!
    • Просмотр профиля
Re: часовой пояс в си
« Ответ #6 : 17 Января 2015, 22:44:15 »
Есть еще одна вещь, которую нужно учитывать...
Формат времени time_t: в 32 битной системе занимает 4 байта, а в 64 битной - 8 байт.
Учитывать надо другую вещь - доживет ли программа до 2038 года ;)
Извините, я все еще учусь

Оффлайн FixNix

  • Участник
  • *
  • Сообщений: 208
    • Просмотр профиля
Re: часовой пояс в си
« Ответ #7 : 17 Января 2015, 23:22:31 »
SergeyIT,
И всё же, приятней осознавать, что твоя программа доживёт до 4 декабря 292 277 026 596 года  :)
ubuntu 16.04 x64 - комп. на работе и ноут дома, Nautilus Nemo (2.8.7) для Unity.
Если хочешь сделать что-то хорошо, сделай это сам.

Оффлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5743
  • Все по палатам!
    • Просмотр профиля
Re: часовой пояс в си
« Ответ #8 : 17 Января 2015, 23:27:13 »
FixNix,
SergeyIT,
И всё же, приятней осознавать, что твоя программа доживёт до 4 декабря 292 277 026 596 года  :)
Особенно, если именно она станет причиной нового Большого взрыва ;)
Извините, я все еще учусь

 

Страница сгенерирована за 0.031 секунд. Запросов: 26.