Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: время создания файла POSIX<->DOS  (Прочитано 9241 раз)
0 Пользователей и 1 Гость смотрят эту тему.
psl
Гость
« : 20-12-2005 09:32 » new

Как преобразовать время создания файла из формата DOS в формат POSIX и наоборот?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 20-12-2005 15:43 » 

По POSIX дата хранится как целое длиной 32 бита, означающее число секунд с началом отсчета "1970-01-01 00:00:00". Если интерпретировать это число как беззнаковое, то предел наступит в 2106-ом году, а для знакового - 2038-ом.

Формат даты и времени в MSDOS:
│ 1 1 1 1 1 1                       Load word at DIR_ENTRY+16H into a
│╓5┬4┬3┬2┬1┬0┬9┬8╥7┬6┬5┬4┬3┬2┬1┬0╖  16-bit register and perform mask
│║   hour  │  minute   │  sec/2  ║  and shift operations to extract
│╙─┴─┴─┴─┴─┴─┴─┴─╨─┴─┴─┴─┴─┴─┴─┴─╜  components of the file time.
│ ╚╦╝ ╚╦╝ ╚╦╝
│     ║          ║          ╚► 2-second increments (0-30 valid) (t & 001fH)
│     ║          ╚► minute (0-59 valid)       ((t & 07e0H) >> 5)
│     ╚► hour (0-23 valid)       ((t & 0f800H) >> 11)

│ 1 1 1 1 1 1
│╓5┬4┬3┬2┬1┬0┬9┬8╥7┬6┬5┬4┬3┬2┬1┬0╖
│║    year     │ month │   day   ║  Use word at DIR_ENTRY+18H.  After 16-bit
│╙─┴─┴─┴─┴─┴─┴─┴─╨─┴─┴─┴─┴─┴─┴─┴─╜  masks and shifts, add 1980 (07bcH) to year.
│ ╚╦╝ ╚╦╝ ╚╦╝
│       ║          ║        ╚► day (0-31)                       (d & 001fH)
│       ║          ╚► month (1-12 valid)        ((d & 01e0H) >> 5)
│       ╚► year (0-119 valid)        ((d & f800H) >> 9)
Отсчет идет от "1980-01-01 00:00:00". Предел - 2099 год.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
psl
Гость
« Ответ #2 : 21-12-2005 12:03 » 

большое спасибо.

А стандартных средств никаких нет?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 21-12-2005 19:23 » 

таких не знаю. Я бы сделал конверсию через struct tm:
Код:
time_t time_dos2unix(unsigned long ddt)
{
  struct tm tm;

  memset((void*)&tm, 0, sizeof(tm));

  tm.tm_year = ((ddt & 0xf8000000) >> 25) + 80;
  tm.tm_mon = ((ddt & 0x01e00000) >> 21) - 1;
  tm.tm_mday = ((ddt & 0x001f0000) >> 16);
  tm.tm_hour = ((ddt & 0x0000f800) >> 11);
  tm.tm_min = ((ddt & 0x000007e0) >> 5);
  tm.tm_sec = ddt & 0x0000001f;
  tm.tm_isdst = -1; /* над этим местом стоит подумать */

  return mktime(&tm);
}

unigned long time_unix2dos(time_t udt)
{
  struct tm tm;
  unsigned long ddt;

  memset((void*)&tm, 0, sizeof(tm));

  gmtime_r(&udt, &tm);

  ddt = ((tm.tm_year - 80) << 25) |
    ((tm.tm_mon + 1) << 21) |
    ((tm.tm_mday << 16) |
    ((tm.tm_hour << 11) |
    (tm.tm_min << 5);
    tm.tm_sec;

  return ddt;
}
Я несколько не уверен насчет дней - "day (0-31)" - то ли с 0, то ли с 1...
« Последнее редактирование: 21-12-2005 19:25 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
psl
Гость
« Ответ #4 : 23-12-2005 10:04 » 

Спасибо. Примерно так и пришлось сделать.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines