для дат 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;
}
для остальных дат надо делать пересчёт с учётом более длинных циклов и нулевого года.