05.06.2012, 13:13
Hi Jochemd, I think it's great that you decided to make this useful include.
I had a quick look at your code and I think it doesn't support negative timestamp. I made something like this the other day in C as a part of my programming assignment and I wanted to port it to PAWN, but seeing as you are already working on it, I may as well share my C code here. It supports negative timestamps, but doesn't regard timezones, but it's easy to implement.
I had a quick look at your code and I think it doesn't support negative timestamp. I made something like this the other day in C as a part of my programming assignment and I wanted to port it to PAWN, but seeing as you are already working on it, I may as well share my C code here. It supports negative timestamps, but doesn't regard timezones, but it's easy to implement.
Код:
bool is_leap_year(int year) { /* This function checks if given year is a leap year: it must be divisible by 4 and not divisible by 100 unless it's also divisible by 400 - according to wikipedia */ return ((year % 4) == 0 && (((year % 100) != 0) || ((year % 400) == 0))); } int get_num_days(int year) { /* Simple function, just returns number of days in given year: either 365 or 366 (leap year) */ return (is_leap_year(year)?366:365); } void timestamp_to_date(int timestamp, int *y, int *m, int *d, int *h, int *min, int *s) { /* This is a highly sophisticated function that I created. It turns timestamp into ymd and hms. */ int days = timestamp / (60*60*24), //converting timestamp to days by dividing it by number of seconds in a day month_days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //defining number of days in a month /* Initialising starting date */ if (timestamp >= 0) { /* Getting time of the day is very simple, So I do it first. Just take the ramainder from dividing by number of seconds in a day */ *s = timestamp % (60*60*24); *min = *s / 60; //convert seconds to minutes... *s = *s % 60; //...and keep the remainder *h = *min / 60; //Same goes for hours... *min = *min % 60; //...and minutes /* Now the ugly part: 'day' stores number of days since 1st January 1970. Somehow this has to be converted into a date. It's tricky, since some years have 366 days, some have 365. */ *d = 1; *m = 1; *y = 1970; int year_days; //this variable stores number of days in current year, so I don't have to call the function twice in each iteration (efficiency) while (days > (year_days = get_num_days(*y))) { /* And loop through all years, substracting number of days passed each year... .. until number of days left is less than number of days in that year */ days -= year_days; (*y)++; } /* Now tha I know what year it is, time to ensure that number of days in february is correct for the current year: */ if (is_leap_year(*y)) month_days[1] = 29; while (days > month_days[(*m)-1]) { /* Looking for the month the same way I was looking for year */ days -= month_days[(*m)-1]; (*m)++; } // Remaining number of days is obviously the day of the month. *d += days; } else //same thing but in reverse { int year_days; days = -days; *s = -((timestamp) % (60*60*24))-1; *min = *s / 60; *s = *s % 60; *h = *min / 60; *min = *min % 60; *s = 59 - (*s); *min = 59-(*min); *h = 23-(*h); *d = 31; *m = 12; *y = 1969; while (days > (year_days = get_num_days(*y))) { days -= year_days; (*y)--; } if (is_leap_year(*y)) month_days[1] = 29; while (days > month_days[(*m)-1]) { days -= month_days[(*m)-1]; (*m)--; } *d = month_days[(*m)-1] - days; } }