Как сделать флажки часового, минутного смещения в программировании на C
Я использую C на Unix. Программа отображает время, и я пытаюсь выяснить, как сместить текущее время в минутах и часах.
Эта часть кода
while ( ( let = getopt(argc, argv, "alo:vh")) != -1 ) {
switch (let) {
case 'o': offset = atoi(optarg); break; }
и позже в этой части:
void clock(int sig, int time_expires)
{
time_t now;
struct tm *dateinfo;
(void) time(&now);
now = now + offset;
dateinfo = localtime( &now ); }
Создает смещение -o, которое смещает текущее время на определенное количество секунд. Например, -o590 сместит текущее время на 590 секунд.
Я пытаюсь выяснить, как сделать то же самое, только с помощью флага -h, который смещает время на определенное количество часов (например, -h6 смещает время на 6 часов), или с помощью флага -m, который смещает время на минут.
Я попытался разделить текущий флаг -o на 60 или 360, но это не работает. Кто-нибудь может указать мне правильные направления здесь?
2 ответа
Изменить time_t
на столько часов, минут, секунд в портативном режиме, не полагаясь на time_t
некоторый целочисленный тип секунд с 1970 года, используйте mktime()
time_t adjust(time_t t, int hour, int minute, int second) {
struct tm *dateinfo;
dateinfo = localtime(&t);
if (dateinfo == NULL) return (time_t) -1;
dateinfo->tm_hour += hour;
dateinfo->tm_min += minute;
dateinfo->tm_sec += second;
return mktime(dateinfo);
}
time_t
структура определяет количество секунд с 1 января 1970 года по Гринвичу.
Если вы хотите добавить n минут, вы должны сделать:
now+= n*60
И в течение n часов вы должны:
now+= n*3600
В качестве альтернативы вы можете использовать struct tm
и получить доступ непосредственно к временным квантам, которые вы хотите изменить.
struct tm {
int tm_sec; /* seconds, range 0 to 59 */
int tm_min; /* minutes, range 0 to 59 */
int tm_hour; /* hours, range 0 to 23 */
int tm_mday; /* day of the month, range 1 to 31 */
int tm_mon; /* month, range 0 to 11 */
int tm_year; /* The number of years since 1900 */
int tm_wday; /* day of the week, range 0 to 6 */
int tm_yday; /* day in the year, range 0 to 365 */
int tm_isdst; /* daylight saving time */
};