Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.85/34: Рейтинг темы: голосов - 34, средняя оценка - 4.85
Заблокирован
1

Представление time_t

06.11.2015, 18:33. Просмотров 7052. Ответов 23
Метки нет (Все метки)

как представлено число time_t? я имею ввиду порядок данных в нем, где год, где месяц и т.д. насколько я понимаю по 1 байту занимают год (от 1970), месяц, день, час, минута и секунда, а миллисекунды 2 байта, итого 8, вот только не пойму в каком порядке они там идут... делу не способствует также странный результат функции time, она возвращает например вот только что 1446823461, то есть у числа все верхние 4 байта забиты нулями... странно это, при том localtime_s все равно нормально время возвращает из этого числа...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.11.2015, 18:33
Ответы с готовыми решениями:

Перевод time_t в tm C++
Я чот не могу понять, почему, когда я перевожу time_t со значением 26331 в tm, я вместо того, что...

из string в time_t
Подскажите пожалуйста можно ли преобразовать string в time_t?

тип time_t
Нужно ввести 2 переменные типа time_t с клавиатуры , потом переконвертировать их в строки и...

Менять дату в time_t
Всем привет. Как-то можно тут изменить дату? В идеале добавить или отнять несколько секунд, чтобы...

23
Эксперт PHP
2724 / 2375 / 1110
Регистрация: 14.05.2014
Сообщений: 6,778
Записей в блоге: 1
06.11.2015, 18:41 2
Volrajas, time_t - это тип данных используется для представления целого числа — количества секунд, прошедших после полуночи 00:00 , 1 января 1970 года в формате GMT. Т.е. обычный целочисленный тип данных.
1
Заблокирован
06.11.2015, 18:54  [ТС] 3
Kerry_Jr, ааа, а я думал там в самом числе они закодированы

Добавлено через 9 минут
я вот только думаю а как оно кодирует если год меньше 1970?

Добавлено через 50 секунд
C++
1
2
3
4
5
6
7
8
9
10
tm tm{ 0 };
tm.tm_year = 1000;
tm.tm_mon = 6;
tm.tm_mday = 15;
tm.tm_hour = 12;
tm.tm_min = 30;
tm.tm_sec = 30;
time_t t = mktime(&tm);
memset(&tm, 0, sizeof tm);
localtime_s(&tm, &t);
и ведь не подкопаешься, работает, а вот как не врубаюсь чет...
0
Эксперт PHP
2724 / 2375 / 1110
Регистрация: 14.05.2014
Сообщений: 6,778
Записей в блоге: 1
06.11.2015, 18:54 4
Volrajas, отрицательные числа никто не отменял.
0
Заблокирован
06.11.2015, 18:56  [ТС] 5
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Volrajas, отрицательные числа никто не отменял.
в смысле отрицательные? где тут отрицательные числа? time_t это unsigned long long беззнаковое 64х битное число
0
Эксперт PHP
2724 / 2375 / 1110
Регистрация: 14.05.2014
Сообщений: 6,778
Записей в блоге: 1
06.11.2015, 20:18 6
Volrajas, если вы напишете
C++
1
cout << t;
то выведется -1. По крайней мере у меня так. Хотя я с этим пока толком не разбирался. Будем посмотреть.

Добавлено через 3 минуты
mktime в случае ошибки возвращает -1.
0
Заблокирован
06.11.2015, 20:29  [ТС] 7
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
то выведется -1. По крайней мере у меня так. Хотя я с этим пока толком не разбирался. Будем посмотреть.
какой компилятор? у меня в visual studio нет такого, все выводит нормально
0
6912 / 5977 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
06.11.2015, 20:48 8
2900-й год в Visual Studio показывает.
0
Заблокирован
06.11.2015, 20:51  [ТС] 9
Цитата Сообщение от nmcf Посмотреть сообщение
2900-й год в Visual Studio показывает.
Б - Брехня (с)
0
Миниатюры
Представление time_t  
Эксперт PHP
2724 / 2375 / 1110
Регистрация: 14.05.2014
Сообщений: 6,778
Записей в блоге: 1
06.11.2015, 21:26 10
Volrajas, есть и вижуал, но для коротышек использую MinGW 4.9.2. Попробовал даты после 1970, все равно не работает. Не пойму почему.
0
6912 / 5977 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
06.11.2015, 21:35 11
Вот это выведет 2900-й год:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main() {
    // your code goes here
    tm tm;
tm.tm_year = 1000;
tm.tm_mon = 6;
tm.tm_mday = 15;
tm.tm_hour = 12;
tm.tm_min = 30;
tm.tm_sec = 30;
time_t t = mktime(&tm);
printf ("The current time is: %s", ctime (&t));
 
    system("pause");
 
    return 0;
}
0
Заблокирован
06.11.2015, 21:42  [ТС] 12
Цитата Сообщение от nmcf Посмотреть сообщение
Вот это выведет 2900-й год:
хз я такой не пользуюсь, да действительно выводит 2900, хз может багнутая какая то функция... и все же mktime работает верно... короче мне просто сейчас интересно как же все таки возможно указание года до 1970 если число в time_t указывает количество секунд от 1970 года до сейчасшнего момента?
0
6912 / 5977 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
06.11.2015, 23:29 13
В tm можешь что угодно указывать, а time_t только с 1970.
0
98 / 71 / 13
Регистрация: 15.12.2013
Сообщений: 454
07.11.2015, 00:13 14
Ну хранение года в одном байте в принципе невозможно, ибо в подавляющем большинстве машин байт - 8 бит.
А это значит - 2^8 = 256, нуль тоже входит, поэтому максимальное число, которое может храниться в одном байте - 255.
0
182 / 180 / 66
Регистрация: 15.02.2015
Сообщений: 515
07.11.2015, 00:29 15
struct tm странная вещь, вроде и указано что год нужно задавать учитывая что к нему будет прибавлено 1900, однако, при задании значения меньшего "0:00:00 01:01:1970 GMT" mktime завершится ошибкой (time_t будет равен -1). Т.е. для функции mktime и часового пояса +3 часа минимальное значение будет таково:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
tm tm1;
memset(&tm1, 0, sizeof(tm));
tm1.tm_year = 70;
tm1.tm_mon = 0;
tm1.tm_mday = 1;
tm1.tm_hour = 3;
tm1.tm_min = 0;
tm1.tm_sec = 0;
 
time_t time1 = mktime(&tm1);
if (time1 > -1) 
    cout << ctime(&time1) << "Кол-во секунд: " << time1 << endl;
system("pause");
В 2015 студии размер time_t = 8 байтам, что делает верхнюю границу практически бесконечной. Раньше был 4 байта, и по этому поводу всё ещё актуальна "проблема 2038" (для систем на 32-хбитном time_t)

Добавлено через 7 минут

Не по теме:

ps: В 8 байтах уже можно спокойно считать такты (100 наносек. интервалы), хвтит на 10000 лет точно и ещё один бит для зимнего времени останется :D

0
Заблокирован
07.11.2015, 09:23  [ТС] 16
Цитата Сообщение от nmcf Посмотреть сообщение
В tm можешь что угодно указывать, а time_t только с 1970.
то то и оно что когда я указываю в tm год меньше 1970, а потом делаю mktime и из полученного числа снова извлекаю time_t с помощью localtime у меня оно не меняется, т.е. по прежнему в нем указанный год (даже если он меньше 1970), вот что интересно
Цитата Сообщение от ASCII Посмотреть сообщение
Ну хранение года в одном байте в принципе невозможно, ибо в подавляющем большинстве машин байт - 8 бит.
А это значит - 2^8 = 256, нуль тоже входит, поэтому максимальное число, которое может храниться в одном байте - 255.
к чем щас это было сказано вообще? кажется уже все поняли что в числе time_t хранится количество секунд

Добавлено через 1 минуту
Цитата Сообщение от Operok Посмотреть сообщение
struct tm странная вещь, вроде и указано что год нужно задавать учитывая что к нему будет прибавлено 1900, однако, при задании значения меньшего "0:00:00 01:01:1970 GMT" mktime завершится ошибкой (time_t будет равен -1).
дак ведь нет же!!! у меня не завершается с ошибкой, у меня возвращает нормальное число time_t (заполненнные биты правда перелезают за 4 байта), а из него с помощью localtime я получаю исходную tm
0
182 / 180 / 66
Регистрация: 15.02.2015
Сообщений: 515
07.11.2015, 10:13 17
Цитата Сообщение от Volrajas Посмотреть сообщение
дак ведь нет же!!! у меня не завершается с ошибкой, у меня возвращает нормальное число time_t (заполненнные биты правда перелезают за 4 байта), а из него с помощью localtime я получаю исходную tm
Какое значение задаёте полю tm_year в структуре tm, 1000? Если да, то вы указываете 2900 год. Естественно, если вы конвертируете time_t обратно в tm, там опять будет значение 1000 (что соответствует 2900-му году). Используйте функцию ctime(const time_t*)
0
Заблокирован
07.11.2015, 10:40  [ТС] 18
Цитата Сообщение от Operok Посмотреть сообщение
Какое значение задаёте полю tm_year в структуре tm, 1000? Если да, то вы указываете 2900 год. Естественно, если вы конвертируете time_t обратно в tm, там опять будет значение 1000 (что соответствует 2900-му году).
да как так может быть то объясните мне? как именно работают mktime и localtime? и что значит "соответствует" 2900 году? откуда вам знать чему оно соответствует если фактически год можно узнать только через структуру tm
0
182 / 180 / 66
Регистрация: 15.02.2015
Сообщений: 515
07.11.2015, 10:47 19
Цитата Сообщение от Volrajas Посмотреть сообщение
откуда вам знать чему оно соответствует...
Временная структура tm и Тип данных time_t - меньше минуты в гугле
0
6912 / 5977 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
07.11.2015, 15:03 20
Ну переполнение какое-нибудь происходит или ещё что-то, и возникает такой эффект.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.11.2015, 15:03

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

C++ конвертировать char* в time_t
Всем привет. Помогите, пожалуйста разобраться, как нормально конвертировать char* (время полученное...

Преобразование 'time_t' в 'unsigned int'
Массив предназначен для хранения значений ростов двенадцати человек. С помощью датчика случайных...

Работа со временем: заполнение time_t вручную
как грамотно заполнить #include &lt;ctime&gt; time_t структуру ? вручную надо дату забить

Time_t to tm, localtime возвращает tm с неверными значениями
Не могу перевести время из time_t полученное в результате выполнения функции difftime в tm для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.