How to get the current date information only?

Y

YiMkiE

I am a newbie of C and I need to do a program to get the current date
information only, without the time. I have my code here:

#include <stdio.h>
#include <time.h>
#include <string.h>

int main ()
{
time_t rawtime;
struct tm * timeinfo;
char* t;

rawtime = time (NULL);
timeinfo = localtime (&rawtime);
t = asctime(timeinfo);
printf(t);

return 0;
}

How to output only the year, month and day of t?
 
I

Ian Collins

YiMkiE said:
I am a newbie of C and I need to do a program to get the current date
information only, without the time. I have my code here:

#include <stdio.h>
#include <time.h>
#include <string.h>

int main ()
{
time_t rawtime;
struct tm * timeinfo;
char* t;

rawtime = time (NULL);
timeinfo = localtime (&rawtime);
t = asctime(timeinfo);
printf(t);

return 0;
}

How to output only the year, month and day of t?
Use the appropriate fields in 'timeinfo'.
 
R

Robert Gamble

YiMkiE said:
I am a newbie of C and I need to do a program to get the current date
information only, without the time. I have my code here:

#include <stdio.h>
#include <time.h>
#include <string.h>

int main ()
{
time_t rawtime;
struct tm * timeinfo;
char* t;

rawtime = time (NULL);
timeinfo = localtime (&rawtime);
t = asctime(timeinfo);
printf(t);

return 0;
}

How to output only the year, month and day of t?

Lookup the strftime function.

Robert Gamble
 
Y

YiMkiE

Do you mean the tm_year? How to refer to that?
I know this is a stupid question..

Ian Collins 寫é“:
 
N

Nelu

YiMkiE said:
I am a newbie of C and I need to do a program to get the current date
information only, without the time. I have my code here:

#include <stdio.h>
#include <time.h>
#include <string.h>

int main ()
{
time_t rawtime;
struct tm * timeinfo;
char* t;

rawtime = time (NULL);
timeinfo = localtime (&rawtime);
t = asctime(timeinfo);
printf(t);

return 0;
}

How to output only the year, month and day of t?

You either can lookup the members of the struct tm structure
and display only the fields you want or you can use the strftime
function that generates formatted text using different date/time
format specifiers.
 
M

Morris Dovey

YiMkiE (in (e-mail address removed))
said:

| I am a newbie of C and I need to do a program to get the current
| date information only, without the time. I have my code here:
|
| #include <stdio.h>
| #include <time.h>
| #include <string.h>
|
| int main ()
| {
| time_t rawtime;
| struct tm * timeinfo;
| char* t;
|
| rawtime = time (NULL);
| timeinfo = localtime (&rawtime);
| t = asctime(timeinfo);
| printf(t);
|
| return 0;
| }
|
| How to output only the year, month and day of t?

Just write your own function to build the string you want:

char *YiMkiE_date(const struct tm *t)
{ char *mon_name[12] =
{ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
static char date[] = "YYYY MMM DD\n";

sprintf(date,"%d %s %d\n", 1900 + t->tm_year,
mon_name[t->tm_mon], t->tm_mday);
return date;
}

Easy, isn't it?
 
Y

YiMkiE

Thanks all, I have solved the date problem. But now I am getting
another trouble.
I need to concatenate a string and the date string I got to form a file
name.

#include <stdio.h>
#include <time.h>
#include <string.h>

int main()
{
int e;
FILE *fp;
char fname[13] = "AMH_TdySales-";
time_t rawtime;
struct tm * timeinfo;
char t[9];

rawtime = time (NULL);
timeinfo = localtime (&rawtime);
strftime(t ,10 , "%Y%m%d", timeinfo);

strncat(fname, t, 8);
printf(fname);

fp = fopen(fname, "r");
if (fp == NULL)
e = 0;
fclose(fp);

fp = fopen("log.txt", "a");
if (e == 0)
fprintf(fp, "%s - File not found!!\n", fname);
fclose(fp);

return 0;
}

After concatenating the two, the end of line (or array?) character
appears in the middle, causing error. How to remove that?
 
C

Chris Torek

#include <stdio.h>
#include <time.h>
#include <string.h>

int main()
{
int e;
FILE *fp;
char fname[13] = "AMH_TdySales-";

This array has room for 13 "char"s. The initializer:

"AMH_TdySales-\0"
0 1
1234567890123***ran off the end here

*does* fit, just barely, by C's rule that says that the terminating
'\0' of a string literal initializer is discarded when initializing
an array whose size is just big enough to hold everything except the
'\0'.

Or, to put it another way, had you written:

char fname[] = "AMH_TdySales-";

the array would have size *14*, not 13.

The end result is that fname[] contains a sequence of bytes that
is *not* terminated with a '\0', and is therefore not a string
(by definition).
time_t rawtime;
struct tm * timeinfo;
char t[9];

The array "t" has size 9 (in "C bytes", aka chars).
rawtime = time (NULL);
timeinfo = localtime (&rawtime);
strftime(t ,10 , "%Y%m%d", timeinfo);

The array "t" has size 9. Why did you tell strftime() to write at
most *ten* characters into a 9-character array? However, %Y needs
4, %m needs 2, and %d needs 2; and 4+2+2 = 8 -- so strftime() will
write the appropriate 8 characters, then add a ninth '\0' character
to make the result a string, and this does fit.
strncat(fname, t, 8);

The strncat() function needs its first argument to be a string --
a sequence of "char"s terminated by a '\0' character. fname does
not hold a string, so the effect is undefined.

Even if it were OK, this tells strncat to add at most 8 characters
to the original string. If the original string has 13 non-'\0'
characters followed by a '\0', the resulting string will have 13+8
= 21 non-'\0' characters followed by a '\0'. So it needs at least
22 bytes of space.
 
J

jjf

Morris said:
YiMkiE (in (e-mail address removed))
said:

| I am a newbie of C and I need to do a program to get the current
| date information only, without the time. I have my code here:
|
| #include <stdio.h>
| #include <time.h>
| #include <string.h>
|
| int main ()
| {
| time_t rawtime;
| struct tm * timeinfo;
| char* t;
|
| rawtime = time (NULL);
| timeinfo = localtime (&rawtime);
| t = asctime(timeinfo);
| printf(t);
|
| return 0;
| }
|
| How to output only the year, month and day of t?

Just write your own function to build the string you want:

char *YiMkiE_date(const struct tm *t)
{ char *mon_name[12] =
{ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
static char date[] = "YYYY MMM DD\n";

sprintf(date,"%d %s %d\n", 1900 + t->tm_year,
mon_name[t->tm_mon], t->tm_mday);
return date;
}

Easy, isn't it?

Not compared with using strftime(), which also looks after locales for
you. Why re-invent the wheel?
 
Y

YiMkiE

Solved!
Thanks very much Chris!

Chris Torek 寫é“:
#include <stdio.h>
#include <time.h>
#include <string.h>

int main()
{
int e;
FILE *fp;
char fname[13] = "AMH_TdySales-";

This array has room for 13 "char"s. The initializer:

"AMH_TdySales-\0"
0 1
1234567890123***ran off the end here

*does* fit, just barely, by C's rule that says that the terminating
'\0' of a string literal initializer is discarded when initializing
an array whose size is just big enough to hold everything except the
'\0'.

Or, to put it another way, had you written:

char fname[] = "AMH_TdySales-";

the array would have size *14*, not 13.

The end result is that fname[] contains a sequence of bytes that
is *not* terminated with a '\0', and is therefore not a string
(by definition).
time_t rawtime;
struct tm * timeinfo;
char t[9];

The array "t" has size 9 (in "C bytes", aka chars).
rawtime = time (NULL);
timeinfo = localtime (&rawtime);
strftime(t ,10 , "%Y%m%d", timeinfo);

The array "t" has size 9. Why did you tell strftime() to write at
most *ten* characters into a 9-character array? However, %Y needs
4, %m needs 2, and %d needs 2; and 4+2+2 = 8 -- so strftime() will
write the appropriate 8 characters, then add a ninth '\0' character
to make the result a string, and this does fit.
strncat(fname, t, 8);

The strncat() function needs its first argument to be a string --
a sequence of "char"s terminated by a '\0' character. fname does
not hold a string, so the effect is undefined.

Even if it were OK, this tells strncat to add at most 8 characters
to the original string. If the original string has 13 non-'\0'
characters followed by a '\0', the resulting string will have 13+8
= 21 non-'\0' characters followed by a '\0'. So it needs at least
22 bytes of space.
--
In-Real-Life: Chris Torek, Wind River Systems
Salt Lake City, UT, USA (40°39.22'N, 111°50.29'W) +1 801 277 2603
email: forget about it http://web.torek.net/torek/index.html
Reading email is like searching for food in the garbage, thanks to spammers.
 
D

Default User

YiMkiE said:
Keith Thompson 寫é“:


ooops, sorry!
will pay attention to this!

Also trim the quoted material. In particular, remove .sigs (the bits
after the --). A good newsreader does that for you, alas you are using
Google so you have to do it manually.



Brian
 
Y

YiMkiE

I am using google. How to read this group in outlook express or some
other newsreader? (though this may be a bit off topic)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,766
Messages
2,569,569
Members
45,042
Latest member
icassiem

Latest Threads

Top