Ответы пользователя по тегу C++
  • Как быстро округлить timestamp до секунд, минут, часов, дней и т.д.?

    @svistkovr
    для дат timestamp>0 довольно простая математика.
    #include <stdio.h>
    #include <time.h>
    int main(){
    
        time_t all_seconds = time(NULL);
        printf("временная метка - количество секунд с 1970-01-01 00:00:00 +0000 в четверг : %lu\n",all_seconds);
    
        double all_minutes = all_seconds/60.0;
        double all_hours = all_minutes/60.0;
        double all_days = all_hours/24.0;
        double all_years = all_days/(365.0+0.2425); //с учётом високосного
        //timestamp  начинается с 1970-01-01 00:00:00 +0000 в четверг
        long years_l = (int)all_years;
        long year = years_l + 1970;
        printf("год : %ld ",year);
        bool is_leap_year = !((year % 4 != 0) || ((year % 100 == 0) && (year % 400 != 0)));//високосный каждый 4 но не кратен 100
    
        if(is_leap_year){
            printf("високосный\n");
        }else{
            printf("не високосный\n");
        }
    
        double days_from_year_start = all_years - years_l;
        int day_in_month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
        int month=0;
        double day_d=days_from_year_start*(365.0+(is_leap_year?1:0));
        int day=(int)day_d;
        int day_in_month_t;
        do{
            day_in_month_t=day_in_month[month];
            day-=day_in_month_t;
            if(is_leap_year){
                if(month==1){
                    day--;
                }
            }
            month++;
    
        }
        while((month<12) && (day>day_in_month_t));
        const char* month_name[12]={"январь","февраль","март","апрель","май","июль","июнь","август","сентябрь","октябрь","ноябрь","декабрь"};
        printf("месяц : %s\n",month_name[month]);
        day++;// сдвиг нулевого дня 0 -> 1
        printf("день : %d \n",day);
    
        int day_of_week = ((((int)all_days)%7)+3)%7;//сдвиг для 0 дня. 1 день 1970 был в чеверг
        const char* week[7]={"пн","вт","ср","чт","пт","сб","вс"};
        printf("день недели : %s \n",week[day_of_week]);
    
        int hour = ((int)all_hours)%24;
        printf("час для GMT+0 : %d \n",hour);
    
        int minutes = ((int)all_minutes)%60;
        printf("минуты : %d \n",minutes);
    
        int seconds = ((int)all_seconds)%60;
        printf("секунды : %d \n",seconds);
    return 0;
    }

    для остальных дат надо делать пересчёт с учётом более длинных циклов и нулевого года.
    Ответ написан
    Комментировать