Added a datetime_is_valid() function for checking a valid calendar date.

This commit is contained in:
skarg
2013-02-20 23:49:03 +00:00
parent ecaa979948
commit 4c4ea6284b
2 changed files with 67 additions and 5 deletions
+5 -1
View File
@@ -87,6 +87,10 @@ extern "C" {
uint8_t minute,
uint8_t seconds,
uint8_t hundredths);
/* utility test for validity */
bool datetime_is_valid(
BACNET_DATE *bdate,
BACNET_TIME *btime);
/* utility comparison functions:
if the date/times are the same, return is 0
@@ -113,7 +117,7 @@ extern "C" {
BACNET_DATE_TIME * datetime1,
BACNET_DATE_TIME * datetime2);
/* utility add function */
/* utility add or subtract minutes function */
void datetime_add_minutes(
BACNET_DATE_TIME * bdatetime,
int32_t minutes);
+62 -4
View File
@@ -82,18 +82,33 @@ static uint8_t month_days(
return 0;
}
static bool date_is_valid(
uint16_t year,
uint8_t month,
uint8_t day)
{
bool status = false; /* true if value date */
uint8_t monthdays; /* days in a month */
monthdays = month_days(year, month);
if ((year >= 1900) && (monthdays) && (day >= 1) && (day <= monthdays)) {
status = true;
}
return status;
}
static uint32_t days_since_epoch(
uint16_t year,
uint8_t month,
uint8_t day)
{
uint32_t days = 0; /* return value */
uint8_t monthdays; /* days in a month */
uint16_t years = 0; /* loop counter for years */
uint8_t months = 0; /* loop counter for months */
monthdays = month_days(year, month);
if ((year >= 1900) && (monthdays) && (day >= 1) && (day <= monthdays)) {
if (date_is_valid(year, month, day)) {
for (years = 1900; years < year; years++) {
days += 365;
if (is_leap_year(years))
@@ -144,7 +159,6 @@ static void days_since_epoch_into_ymd(
return;
}
/* Jan 1, 1900 is a Monday */
/* wday 1=Monday...7=Sunday */
static uint8_t day_of_week(
@@ -155,6 +169,50 @@ static uint8_t day_of_week(
return (uint8_t) ((days_since_epoch(year, month, day) % 7) + 1);
}
static bool time_is_valid(
uint8_t hour,
uint8_t min,
uint8_t sec,
uint8_t hundredths)
{
bool status = false;
if ((hour < 24) && (min < 60) && (sec < 60) && (hundredths < 100)) {
status = true;
}
return status;
}
/**
* Determines if a given date and time is valid for calendar
*
* @param bdate - pointer to a BACNET_DATE structure
* @param btime - pointer to a BACNET_TIME structure
*
* @return true if the date and time are valid
*/
bool datetime_is_valid(
BACNET_DATE *bdate,
BACNET_TIME *btime)
{
bool status = false; /* return value */
/* get the number of days in the month, and check for valid month too */
if (bdate) {
status = date_is_valid(bdate->year, bdate->month, bdate->day);
if (status && btime) {
status = time_is_valid(btime->hour, btime->min, btime->sec,
btime->hundredths);
} else {
status = false;
}
}
return status;
}
/* if the date1 is the same as date2, return is 0
if date1 is after date2, returns positive
if date1 is before date2, returns negative */