cancel
Showing results for 
Search instead for 
Did you mean: 

Do I have to implement whole calendar sub-system if I let end-user to enter new RTC date and time? I mean Is there a simple way to check whether entered date and time are valid?

Zed
Associate II
 
1 ACCEPTED SOLUTION

Accepted Solutions
berendi
Principal

Put the date entered by the user in a struct tm, and check it with mktime(). It will normalize the date and time, e.g. 35th of May becomes 4th of June, so if there are any differences, then the input parameter was an invalid date.

#include <time.h>
 void check_time(struct tm *a) {
  struct tm b;
  b = *a;
  mktime(&b);
  if(a.tm_year != b.tm_year) {
    warning("year is invalid");
  }
  /* and so on for all fields except tm_wday, tm_yday and tm_isdst */
}

Mind the peculiarities of struct tm

           struct tm {
               int tm_sec;    /* Seconds (0-60) */
               int tm_min;    /* Minutes (0-59) */
               int tm_hour;   /* Hours (0-23) */
               int tm_mday;   /* Day of the month (1-31) */
               int tm_mon;    /* Month (0-11) */
               int tm_year;   /* Year - 1900 */
               int tm_wday;   /* Day of the week (0-6, Sunday = 0) */
               int tm_yday;   /* Day in the year (0-365, 1 Jan = 0) */
               int tm_isdst;  /* Daylight saving time */
           };

View solution in original post

1 REPLY 1
berendi
Principal

Put the date entered by the user in a struct tm, and check it with mktime(). It will normalize the date and time, e.g. 35th of May becomes 4th of June, so if there are any differences, then the input parameter was an invalid date.

#include <time.h>
 void check_time(struct tm *a) {
  struct tm b;
  b = *a;
  mktime(&b);
  if(a.tm_year != b.tm_year) {
    warning("year is invalid");
  }
  /* and so on for all fields except tm_wday, tm_yday and tm_isdst */
}

Mind the peculiarities of struct tm

           struct tm {
               int tm_sec;    /* Seconds (0-60) */
               int tm_min;    /* Minutes (0-59) */
               int tm_hour;   /* Hours (0-23) */
               int tm_mday;   /* Day of the month (1-31) */
               int tm_mon;    /* Month (0-11) */
               int tm_year;   /* Year - 1900 */
               int tm_wday;   /* Day of the week (0-6, Sunday = 0) */
               int tm_yday;   /* Day in the year (0-365, 1 Jan = 0) */
               int tm_isdst;  /* Daylight saving time */
           };