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>
