3

Уважаемые коллеги! Производственная необходимость просит написать текущее время за минусом 10 минут и у меня не очень-то получается. Напомню, что получают время примерно так:

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <windows.h>
#include <cstddef> // size_t
#include <cstring> // strlen, strcpy

using namespace std;


int main()
{
    setlocale(LC_ALL, "Russian");

    SYSTEMTIME st, lt;

    GetSystemTime(&st);
    GetLocalTime(&lt);
    double dm = st.wMinute - 5; //за минусом 5 минут
    double dm1 = lt.wMinute - 5; //за минусом 5 минут
    //Просто вывод времени
    printf("The system time is: %02d:%02d\n", st.wHour, st.wMinute);
    printf(" The local time is: %02d:%02d\n", lt.wHour, lt.wMinute); 
    //Новое время для моего проекта.
    printf("The system time is: %02d:%02d\n", st.wHour, dm); 
    printf(" The local time is: %02d:%02d\n", lt.wHour, dm1);
    system("PAUSE");
    return 0;
}

Output:

The system time is: 09:24
 The local time is: 12:24
The NEW system time is: 09:00
 The NEW local time is: 12:00

Вполне очевидно что третья и четвёртая строка нас не могут удовлетворить. Как грамотно исправить это безобразие?

  • Что вы делаете между вызовами printf? Или вы хотите сказать, что значение времени меняется само? – Harry Mar 02 '17 at 09:37
  • @Harry sorry. Я косо скопировал главную строку. Поправил. – Andrew Kachalin Mar 02 '17 at 09:40
  • Вы точно поправили? Т.е. вы выводите значение double с помощью спецификатора %02d? – Harry Mar 02 '17 at 09:44
  • @Harry да всё как здесь – Andrew Kachalin Mar 02 '17 at 09:46
  • Посмотрите связанный вопрос, чтобы понять почему не стоит double с помощью %d печатать – jfs Mar 02 '17 at 09:47
  • 1
    Нет, не все. Еще раз и медленно: вы выводите double с помощью спецификатора %02d. По указанной вами ссылке так выводится целочисленное значение. Начните с исправления строк вывода. Это не единственная ваша проблема, вы столкнетесь с другой, когда соберетесь уменьшать на 5 минут, скажем, 2 минуты... но для начала - исправьте код. Зачем вам здесь double? – Harry Mar 02 '17 at 09:52
  • @Harry разобрался. На int нужно заменить. Можете дать ответ - и я вам так-сказать приму. Или – Andrew Kachalin Mar 02 '17 at 09:55

2 Answers2

5

Вы не указали ОС, для которой пишете задачу. Судя по вызовам - Windows? В Linux всё очень просто:

#include <time.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
    time_t t_wrk, t_10;
    struct tm *ptm;

    t_wrk = time(NULL); // Текущее время в СЕКУНДАХ
    t_10 = t_wrk - 600; // 10 минут назад

    // Печатаем результат
    ptm = localtime(&t_wrk);
    printf("Было: %d минут\n", ptm->tm_min);
    ptm = localtime(&t_10);
    printf("Стало: %d минут\n", ptm->tm_min);
}

Подозреваю, что и в виндовозе эти базовые функции работы со временем давным-давно реализованы. Проверил на переход границы часа. Границу суток проверят не стал - слишком уж всё очевидно!

Sergey
  • 13,474
4

Чувствую, что намеки в комментариях не помогают...
Начните со строк

double dm = st.wMinute - 5; //за минусом 5 минут
double dm1 = lt.wMinute - 5; //за минусом 5 минут

Замените их строками

int dm = st.wMinute - 5; //за минусом 5 минут
int dm1 = lt.wMinute - 5; //за минусом 5 минут

Дальше будут другие проблемы - когда эта разность окажется отрицательной... но это уже немного другой вопрос.

Harry
  • 221,325