2 / 2 / 1
Регистрация: 04.02.2010
Сообщений: 143

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

25.08.2011, 09:47. Показов 4316. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
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 и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru