Date: Thu, 31 Mar 2005 20:53:12 +0900 From: Ganbold <ganbold@micom.mng.net> To: freebsd-hackers@FreeBSD.org Subject: subtracting days from localtime problem Message-ID: <6.2.0.14.2.20050331203318.031f2050@202.179.0.80>
next in thread | raw e-mail | index | archive | help
Hi hackers, I have problem subtracting days from current date using test program. We have daylight saving occured on 2AM of March 26, 2005. As you can see below, there is missing March 26th line from program output. And all lines after 27th March are wrong. Instead of 25th March it should be 26th March, 24th March should be 25th March and so on. Can somebody tell me why is this happening? How can I correct this problem? thanks in advance, Ganbold Here is system info: # uname -an FreeBSD backend.ub.mng.net 4.11-PRERELEASE FreeBSD 4.11-PRERELEASE #4: Tue Dec 14 18:18:34 ULAT 2004 tsgan@backend.ub.mng.net:/usr/obj/usr/src/sys/DB i386 # env | grep TZ TZ=Asia/Ulaanbaatar # date Thu Mar 31 20:45:14 ULAST 2005 Here is program output: # ./test_date Thu Mar 31 20:36:47 2005 Current Date: 2005-03-31 0 day(s) before current Date: 2005-03-31 1 day(s) before current Date: 2005-03-30 2 day(s) before current Date: 2005-03-29 3 day(s) before current Date: 2005-03-28 4 day(s) before current Date: 2005-03-27 5 day(s) before current Date: 2005-03-25 6 day(s) before current Date: 2005-03-24 7 day(s) before current Date: 2005-03-23 8 day(s) before current Date: 2005-03-22 9 day(s) before current Date: 2005-03-21 10 day(s) before current Date: 2005-03-20 11 day(s) before current Date: 2005-03-19 12 day(s) before current Date: 2005-03-18 13 day(s) before current Date: 2005-03-17 14 day(s) before current Date: 2005-03-16 15 day(s) before current Date: 2005-03-15 16 day(s) before current Date: 2005-03-14 17 day(s) before current Date: 2005-03-13 18 day(s) before current Date: 2005-03-12 19 day(s) before current Date: 2005-03-11 20 day(s) before current Date: 2005-03-10 21 day(s) before current Date: 2005-03-09 22 day(s) before current Date: 2005-03-08 23 day(s) before current Date: 2005-03-07 24 day(s) before current Date: 2005-03-06 25 day(s) before current Date: 2005-03-05 26 day(s) before current Date: 2005-03-04 27 day(s) before current Date: 2005-03-03 28 day(s) before current Date: 2005-03-02 29 day(s) before current Date: 2005-03-01 30 day(s) before current Date: 2005-02-28 31 day(s) before current Date: 2005-02-27 Total run time = 0 sec # Here is test program. test_date.c ------------------------------------------------------------------------------------------ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <sys/time.h> #include <time.h> char *getDate(int day); char *my_alloc(char *strin); int main(int argc, char *argv[]){ time_t now; int start_day = 1; struct timeval t1; struct timeval t2; char *m_date, *cur_date; int i; long d; gettimeofday(&t1,NULL); now = time(NULL); fprintf(stderr, "%s\n",ctime(&now)); start_day = 32; cur_date = getDate(0); for(i=0;i<start_day;i++){ printf("%d day(s) before current ",i); m_date = getDate(i); } gettimeofday(&t2,NULL); printf("\nTotal run time = %ld sec\n", (t2.tv_sec - t1.tv_sec)); exit(0); } char *getDate(int day) { struct tm *t; time_t now; char date[12]; char *localdate; time_t p; now = time(NULL); t = localtime(&now); t->tm_mday -= day; t->tm_hour = t->tm_min = t->tm_sec = 0; p = mktime(t); if (p == (time_t)-1) printf ("mktime failed\n"); snprintf (date,11,"%d-%.2d-%.2d", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday); if((localdate=my_alloc(date))==NULL){ fprintf(stderr, "Allocation error!\n"); exit(2); } printf("Date: %s\n",localdate); return localdate; } /*---------------------------------------------------------------------------------------------------------------------*/ char *my_alloc(char *strin) { int len; char *p; len = strlen (strin) + 1; p = (char *)malloc(len); if (p != NULL) { strcpy (p, strin); } return (p); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6.2.0.14.2.20050331203318.031f2050>