Я пытаюсь написать код C ++, который подсчитывает количество лет, месяцев, недель, часов и минут с 1 января 1970 года. Я включаю код, который у меня есть в настоящее время. Пожалуйста, помогите мне. Заранее спасибо.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>int main(){
double seconds, minutes, days, weeks, months, years, hours;seconds = time(NULL);
minutes = seconds / 60;
hours = minutes / 60;
days = hours / 24;
weeks = days / 7;
months = weeks / 4;
years = days / 365;
months = (int) (days / 30.42) % 12;
weeks = (int) (days / 7) % 52;
days = (int) (hours / 24) % 24;
hours = (int) (minutes / 60) % 1;
minutes = (int) (seconds / 60) % 60;printf("%d years \n", (int)years);
printf(" %d months \n", (int)months);
printf(" %d weeks\n", (int)weeks);
printf(" %d days \n", (int)days);
printf(" %d minutes\n", (int)minutes);
printf(" %d hours\n\n", (int)hours);system("pause");
}
Для начала вам необходимо решить, в каком часовом поясе вы хотите получить эту информацию.
Тогда вместо того, чтобы писать код самостоятельно, используйте либо gmtime_r
чтобы получить результат в UTC или localtime_r
чтобы получить результат в вашем текущем TZ
местный часовой пояс.
Вы должны проверить стандартные функции locatime()
а также gmtime()
первый. Они с готовностью отвечают вашей цели.
time_t t = time(NULL);
if (t == -1) { printf("time() failure"); return; }
struct tm *tmp;
tmp = localtime(&t);
if (tmp == NULL) { printf("gmtime() failure"); return; }
int seconds = tmp->tm_sec;
int minutes = tmp->tm_min;
int hours = tmp->tm_hour;
int days = tmp->tm_mday + 1;
int weeks = (days-1)/7; // OP code has 2 `weeks` calculated, go with week-of-the-month rather than week-of-the-year
days -= weeks*7;
int months = tmp->tm_mon + 1;
int years = tmp->tm_year + 1900;
printf("%d years \n", years);
printf("%d months \n", months);
printf("%d weeks \n", weeks);
printf("%d days \n", days);
printf("%d hours \n", hours);
printf("%d minutes \n", minutes);
printf("%d seconds \n", seconds);
Если вы действительно хотите сделать это самостоятельно, у вас есть работа. Вы не указали часовой пояс, поэтому давайте перейдем к самому простому: UTC. Далее, давайте сделаем это в unsigned
столько, сколько мы можем, как это проще. Вы можете изменить его на int
если нужно.
// Get the time
time_t t = time(NULL);
if (t < 0) {
; // handle this error condition
}
unsigned seconds = t%60;
t /= 60;
unsigned minutes = t%60;
t /= 60;
unsigned hours = t%24;
t /= 24;
// now begins the tricky bit.
// `t` represent the number of days since Jan 1, 1970.
// I would show more here, but unless I know you are wanting this path, I'd rather not do the work.printf("%d years \n", (int)years);
printf("%d months \n", (int)months);
printf("%d weeks\n", (int)weeks);
printf("%d days \n", (int)days);
printf("%d minutes\n", (int)minutes);
printf("%d hours\n\n", (int)hours);