Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование времени, Как преобразовать время 
:(
    Опции темы
alex2011
Дата 16.1.2011, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.1.2011

Репутация: нет
Всего: нет



Hi All. 

Вопрос такой:
Существуют ли стандартные средства (да ещё такие, чтоб работали на разных платформах) для преобразования вот такой строки:

"2011-01-14T13:55:28.767+06:00"

в какое-нибудь из представлений времени (time_t, struct tm)  ?

Распарсить его руками конечно же не сложно (даже с учетом того, что миллисекунды могут быть либо не быть, так же, как и смещение относительно Гринвича). Но вот в чём вопрос: как потом преобразовать это время в местное?
Т.е. тут как-то получается, что вот от этих +06:00 надо отнять 3 или 4 (если для Москвы), в зависимости от того, летнее время на дату 2011-01-14 или нет.
А вот как бы определить дату перевода времени на летнее или зимнее в таком-то году? Или я вообще иду не тем путём (я не имею в виду здесь выбор языка или платформы) ?
PM MAIL   Вверх
Vicul
Дата 16.1.2011, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 27.4.2009

Репутация: нет
Всего: нет



Цитата

"2011-01-14T13:55:28.767+06:00"

Если прога работает с mysql, там у мускула есть функция, которя берет такую строку и выдает юникс временной штамп, 
короче  через sql запрос.
Конечно дебильно, но работает.

Цитата

А вот как бы определить дату перевода времени на летнее или зимнее в таком-то году?


Я когда то определял время летнее или зимнее из текущего.  Я понимаю может это не то,
но вдруг подойдет

Код

 
  //get time 
  time_t  tv;
  tm* ptm = NULL;
  char day[6] = {0};
  char weekDay[2] ={0};
  char currentTimeStr[6] = {0};
  int32_t currentTime = 0;

  time(&tv);
  ptm = gmtime(&tv);
  strftime(weekDay, sizeof(weekDay), "%u", ptm);

  strftime(day, sizeof(day), "%d.%m", ptm);
  strftime(currentTimeStr, sizeof(currentTimeStr), "%H:%M", ptm);
  currentTime =  TranslateStrTimeToSeconds(currentTimeStr);
  //translate to Moscow
  if (DefineSummerWinterTime(day, weekDay))
    {//summer
      currentTime += 14400;// 4 * 3600;
   
    }
  else
    {//winter
      currentTime  += 10800;// 3 * 3600;
   
    }
 

Там я определяю Лондонское время, у меня сервере был на Амазоне, поэтому нужна была точная временная привязка. Далее из него получал  tm* ptm, а из него  день недели weekDay  и сам день и месяца (day) в формате день.месяц и время в секундах.  Потом определял московское время по лету или зиме. Вот функции

Код

int32_t TranslateStrTimeToSeconds(char* pStrTime)
{ //convert a string "hr:min" to seconds
  char strTimeHr[3] = {0};
  char strTimeMin[3] = {0};

  strncpy(strTimeHr, pStrTime, 2);
  strncpy(strTimeMin, (pStrTime + 3), 2);

  return strtol(strTimeHr, (char**)NULL, 10) * 3600 +
    strtol(strTimeMin, (char**)NULL, 10) * 60;
}

int32_t DefineSummerWinterTime(char* pDayMonth, char* pWeek)
{
  //result:
  // 1 - summer
  //0 - winter
  
  int32_t day;
  int32_t week;
  int32_t month;
  char strTmp[3] = {0};

  //day
  strncpy(strTmp, pDayMonth, 2);
  day  = strtol(strTmp, (char**)NULL, 10);
  //week
  week = strtol(pWeek, (char**)NULL, 10);
  //month
  memset(strTmp, 0, 3);
  strncpy(strTmp, (pDayMonth + 3), 2);
  month = strtol(strTmp, (char**)NULL, 10);
  
  if (month < 3)
    return 0;
  if ( (month >3) && (month < 10))
       return 1;
  if (month >10)
    return 0;
  if (month == 3)
    {//March
      if (day < 26)
    return 0;
      if ((day + 7 - week) > 31)
    return 1;
      else
    return 0;
    }
  if (month == 10)
    {//October
      if (day < 26)
    return 1;
      if ((day + 7 - week) > 31)
    return 0;
      else
    return 1;
    }
  return 1;
}


PM MAIL   Вверх
Фантом
Дата 16.1.2011, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 1
Всего: 49



Цитата(alex2011 @  16.1.2011,  15:04 Найти цитируемый пост)

А вот как бы определить дату перевода времени на летнее или зимнее в таком-то году? 

Есть формальное правило: переход на летнее время происходит в 2:00 (на зимнее - в 3:00) в последнее воскресенье марта (на зимнее - октября).
PM   Вверх
VirtualVoid
Дата 16.1.2011, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 4.8.2009
Где: Сибирь

Репутация: нет
Всего: 1



В никсах есть стандартная функция strptime, в винде нету.
В бусте вроде тоже есть ее реализация. Еще можно попробовать скомпилировать ее самостоятельно, выкинув лишнее, например из нетбсдшной реализации.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0854 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.