KazIT
asked on
date variable
Hi,
I have a series of structs in a program. One of the structs listed here
//Date struct
struct Date{
int day;
int month;
int year;
};
requires 2 functions
fileInputDate- to read a date in the format dd/mm/yyyy from a text file and return a variable of type Date.
outputDate- to display a Date variable in an acceptable format.
I need to know what type of data is best to use for the date variable.
Thanks
Kaz
I have a series of structs in a program. One of the structs listed here
//Date struct
struct Date{
int day;
int month;
int year;
};
requires 2 functions
fileInputDate- to read a date in the format dd/mm/yyyy from a text file and return a variable of type Date.
outputDate- to display a Date variable in an acceptable format.
I need to know what type of data is best to use for the date variable.
Thanks
Kaz
to save some memory you could set your variables to:
struct date{
short unsigned int day;
short unsigned int month;
short unsigned int year;
};
struct date{
short unsigned int day;
short unsigned int month;
short unsigned int year;
};
or even
struct date{
unsigned char day;
unsigned char month;
unsigned short year;
};
struct date{
unsigned char day;
unsigned char month;
unsigned short year;
};
I prefer to have an integer date yyyymmdd as data member like that:
class Date
{
int date;
public:
Date(const string& strDate) : date(0)
{
int d, m, y;
istringstream istr(strDate);
istr >> d; if (istr.fail()) return;
istr >> m; if (istr.fail()) return;
istr >> y; if (istr.fail()) return;
y = (y < 50)? 2000+y : (y < 100)? 1900 + y : y;
if ((y < 1000 || y > 2200) ||
(m < 1 || m > 12 ) ||
(d < 1 || d > 31 ) ||
(d == 31 &&
(m == 4 || m == 6 || m == 9 || m == 11)
) ||
(m == 2 &&
(d > 28 + leap(y) )
)
)
{
return;
}
date = y*10000 + m*100 + d;
}
int leap(int y) { return ((y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0))? 1 : 0; }
bool isValidDate() { return date != 0; }
string getDateAsString()
{ stringstream ss;
ss << date % 100 << '/' << (date%10000) / 100 << '/' << date/10000;
return ss.str();
}
};
Regards, Alex
class Date
{
int date;
public:
Date(const string& strDate) : date(0)
{
int d, m, y;
istringstream istr(strDate);
istr >> d; if (istr.fail()) return;
istr >> m; if (istr.fail()) return;
istr >> y; if (istr.fail()) return;
y = (y < 50)? 2000+y : (y < 100)? 1900 + y : y;
if ((y < 1000 || y > 2200) ||
(m < 1 || m > 12 ) ||
(d < 1 || d > 31 ) ||
(d == 31 &&
(m == 4 || m == 6 || m == 9 || m == 11)
) ||
(m == 2 &&
(d > 28 + leap(y) )
)
)
{
return;
}
date = y*10000 + m*100 + d;
}
int leap(int y) { return ((y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0))? 1 : 0; }
bool isValidDate() { return date != 0; }
string getDateAsString()
{ stringstream ss;
ss << date % 100 << '/' << (date%10000) / 100 << '/' << date/10000;
return ss.str();
}
};
Regards, Alex
>>I need to know what type of data is best to use for the date variable.
Use what the C/C++ runtime libraries use - a 'time_t', which is nothing but a 'long int'.
Use what the C/C++ runtime libraries use - a 'time_t', which is nothing but a 'long int'.
>> Use what the C/C++ runtime libraries use - a 'time_t'
time_t is the number of seconds elapsed since midnight (00:00:00), January 1, 1970, so i wouldn't recommend it for a Date class.
Regards, Alex
time_t is the number of seconds elapsed since midnight (00:00:00), January 1, 1970, so i wouldn't recommend it for a Date class.
Regards, Alex
Why not? The date is included. And, it only uses 4 bytes of space. Since all POSIX conformant systems rely on that...
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
though you can make them as unsigned ints.
as in
struct date{
unsigned int day;
unsigned int month;
unsigned int year;
};
depending on your needs you may also decide to use enum data types for those