Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
2 / 2 / 1
Регистрация: 04.02.2010
Сообщений: 143

Установка системного времени

25.08.2011, 09:47. Показов 4312. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добрый день.
Возникла такая проблема.. Пользователь вводит пять двухзначных значений типа int
типа ЧЧ ММ ДД ММ ГГ. Я все это дело записываю в файл, но так же мне надо установить системное время.
В данный момент реализовал считывание необходимого диапазона чисел, т.е. для ЧЧ 0-23 мин 0-59 и т.д. Надо разобраться с 30/31 числами и установить время...

Считывание значений от пользователя выглядит так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
    while(1){
    strftime(msg,40,"юБУ нЙО дБФ нЕУ зПД %H__%M__%d__%m__%g_",ptr);
 
        key = get_pkey();
        switch(key){
        case KEY_Z:             
            rewind(out);
            sprintf(msg,"юБУ нЙО дБФ нЕУ зПД %02d__%02d__%02d__%02d__%02d_",hour,minut,day,mouth,year);
            fputs(msg,out);
            fclose(out);
            exit(1);
            break;
        case KEY_LEFT:              
            if (position > 22) 
                position = position - 4;
            lcd_print("time", position);
            break;
        case KEY_RIGHT:                 
            if (position <38)
                position = position + 4;
            lcd_print("time",position);
            break;
        case KEY_1:                     
        case KEY_2:                     
        case KEY_3:                     
        case KEY_4:                     
        case KEY_5:                     
        case KEY_6:                     
        case KEY_7:                     
        case KEY_8:                     
        case KEY_9:                     
        case KEY_0:                     
                if (position == 22){
                    ten = get_tens(hour);
                    hour = (hour - ten)*10 + get_number_by_code(key);
                    if (hour > 23) hour = 23;
                    //buf = sprintf();
                    }
                if (position == 26){
                    ten = get_tens(minut);
                    minut = (minut - ten)*10 + get_number_by_code(key);
                    if (minut > 60) minut = 60;
                    }
                if (position == 30){
                    ten = get_tens(day);
                    day = (day - ten)*10 + get_number_by_code(key);
                    if (day > 31) day = 31;
                    }
                if (position == 34){
                    ten = get_tens(mouth);
                    mouth = (mouth - ten)*10 + get_number_by_code(key);
                    if (mouth > 12) mouth = 12;
                    }
                if (position == 38){
                    ten = get_tens(year);
                    year = (year - ten)*10 + get_number_by_code(key);
                    if (year > 90) year = 90;
                    }
                printf("%02d:%02d   %02d-%02d-%02d\n",hour,minut,day,mouth,year);
                
                break;
        default:
            lcd_print("time", position);    
        }       
    }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.08.2011, 09:47
Ответы с готовыми решениями:

Установка системного времени по NTP
Добрый день. Подскажите пожалуйста, как реализовать установку системного времени по времени интернета? Хотя, я думаю, что если с установкой...

Вывод системного времени
нужна помощь в такой задаче. Задание выполняется в двух вариантах: под Linux и Windows. Необходимо разработать консольное приложение, в...

Преобразование системного времени
В программе необходимо найти файлы, которые были изменены за разные промежутки времени, допустим за последний час. Время изменения файла...

14
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
25.08.2011, 10:16
man clock_settime и обратите внимание на то, что нужен root
0
2 / 2 / 1
Регистрация: 04.02.2010
Сообщений: 143
25.08.2011, 10:24  [ТС]
А есть функция для проверки корректно введенных данных для даты? Для того что бы потом передать данные в clock_settime
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
25.08.2011, 10:31
Ну сделайте mktime() на вашу дату.
0
2 / 2 / 1
Регистрация: 04.02.2010
Сообщений: 143
25.08.2011, 11:08  [ТС]
Если сделать примерно так
C
1
2
3
4
5
6
7
8
9
10
11
12
    struct tm t;
    time_t t_of_day;
    int hour = 5, minut = 10, sec, day =29, mounth = 1, year = 2011;
 
    t.tm_year = year - 1900;
    t.tm_mon  = mounth;
    t.tm_mday = day;
    t.tm_hour = hour;
    t.tm_min  = minut;
 
    t_of_day = mktime(&t);
    printf(ctime(&t_of_day));
То выводится 1 марта, а хотелось бы 28 февраля =)
Все таки писать отдельно функцию на работы с днями?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
25.08.2011, 11:25
Цитата Сообщение от painless Посмотреть сообщение
То выводится 1 марта, а хотелось бы 28 февраля =)
Как говориться хотеть не вредно... я вот не понимаю почему 29-02-2011 должно стать 28-02-2011 а не 01-03-2011

Цитата Сообщение от painless Посмотреть сообщение
Все таки писать отдельно функцию на работы с днями?
С такими запросами наверное да
0
2 / 2 / 1
Регистрация: 04.02.2010
Сообщений: 143
25.08.2011, 11:28  [ТС]
Дело тут не в запросах =) есть знакосинтезирующий дисплей, вот на него и надо выводить информацию, введенную с телефонной клавиатуры, поэтому вместо 8, можно неудачно и 9 ввести..
Сейчас что-нибудь придумаем с функцией.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
25.08.2011, 11:37
Т.е на самом деле вы не хотите "нормализовать" введенную дату, а просто проверить что она валидна?
Если так, то например можно сравнить вашу строку с strftime() от того что вернет mktime
0
2 / 2 / 1
Регистрация: 04.02.2010
Сообщений: 143
25.08.2011, 11:44  [ТС]
Эм, и если не получу то, что мне надо, то приравнять к значениям из
strftime(msg,10,"%d:%m:%g",ptr);
я правильно вас понял?

Запутался в своих мыслях, пойду пообедаю и отдохну, вернусь - подумаю еще
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
25.08.2011, 11:50
Вы меня запутали... если приравнять, то и сравнивать ничего не надо, достаточно будет 1го mktime (на вашем примере это и будет 1 марта), я подумал что если даты не совпадают вы хотите ругаться на экран телефона...
0
2 / 2 / 1
Регистрация: 04.02.2010
Сообщений: 143
25.08.2011, 13:47  [ТС]
Да, что-то я бред какой-то написал
Так, то есть мы сначала считываем значение, запоминаем их и устанавливаем системное время, после это считываем значения strftime и если они совпадают с введенными, то все ок, если нет.. То получается, что надо уменьшить день на 1. Правильно тогда я вас понял сейчас?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
25.08.2011, 15:03
Правильно тогда я вас понял сейчас?
Нет. Я не предлагал вам какой-то ИИ вычитающий дни (а почему 1 день а не сразу 3???) а простой способ проверить что дата полученная вами от пользователя корректна.
В 1м посте вы пишете что есть почти готовая то ли struct tm то ли строка
для struct tm сделаем mktime() и получим либо -1 - дата совсем кривая либо какой то time_t
возьмем этот time_t и с помощью localtime() получим еще одну struct_tm
если год/месяц/число в исходной и полученной на предыдущем шаге структурах совпали то все ок,
иначе...
В случае строк либо через strptime сводим к 1му варианту либо так и работаем со строками.
0
2 / 2 / 1
Регистрация: 04.02.2010
Сообщений: 143
25.08.2011, 16:55  [ТС]
Я, конечно, немного неправильно описал чего хочу добиться. Если введены числа 32, 25, 40, для дня месяца, то значение бы записывалось как максимально возможное для данного месяца число
То есть при введение 40, а месяц январь, то на экран бы выводилось 31

Сделал так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void check_date(int day,int month,int year, int hour, int minut)
{
    struct tm t;
    time_t t_of_day;
    char msg1[3]="1\0", msg2[3]="\0";
 
    t.tm_mday = day;
    t.tm_mon  = month-1;
    t.tm_year = year;
    t.tm_hour = hour;
    t.tm_min  = minut;
    t.tm_sec  = 0;
 
    while(strcoll(msg1,msg2)!=0)
    {
        t_of_day  = mktime(&t);
        strftime(msg1,40,"%d",&t);
        sprintf(msg2,"%d",day);
        t.tm_mday--;
        day--;
    }
 
}
Конечно не нравится инициализация строк msg1, msg2, но пока ничего не придумал..
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
25.08.2011, 17:17
Цитата Сообщение от painless Посмотреть сообщение
Я, конечно, немного неправильно описал чего хочу добиться. Если введены числа 32, 25, 40, для дня месяца, то значение бы записывалось как максимально возможное для данного месяца число
То есть при введение 40, а месяц январь, то на экран бы выводилось 31
Ой.
Мне кажется вам стоит пойти в другой раздел и спросить: "Как найти последнее число месяца в заданном году?")))
Там вам раскажут что-нибудь такое:
C
1
2
3
4
int lastdays[] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; /* извините если наврал, я на память */
lastday = lastdays[month];
if (month == 2 && year % 4 == 0 )
    lastday++;
1
2 / 2 / 1
Регистрация: 04.02.2010
Сообщений: 143
26.08.2011, 11:02  [ТС]
все таки все дописал, спасибо за помощь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.08.2011, 11:02
Помогаю со студенческими работами здесь

Обработка системного времени
Добрый день! В БД имеется столбец с произвольными датами) Как сделать так, чтобы при запуске программы этот столбец проверялся по...

Преобразование системного времени
Получаю системное время: SYSTEMTIME Time; GetLocalTime(&amp;Time); Но при выводе значений в формате гггг.мм.дд чч:мм:сс пишет...

Перевод системного времени
Задача отловить изменение системного времени time1=time(NULL); Sleep(delay); time2=time(NULL); if(time1!=time2-delay) ...

Изменение системного времени
Всем привет, имеется следующая проблема. Разработал службу WCF, которая бы изменяла системное время (пользователь не обладает правами...

Изменение системного времени
Здравствуйте, подскажите как на vb изменить системное время, раз в день, в 16:50 изменить на 1 час вперед и через 20 минут на 1 час назад. ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru