📄 app_datetime.c
字号:
if (t->nSec > 59)
{
return KAL_FALSE;
}
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* applib_dt_is_dst_enabled
* DESCRIPTION
* Tp check if daylight saving time is enabled
* PARAMETERS
* void
* t time to be computed(?)
* RETURNS
* TURE if enabled; otherwise, false
*****************************************************************************/
kal_bool applib_dt_is_dst_enabled(void)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
return (kal_bool) mmi_dt_is_dst();
}
/*****************************************************************************
* FUNCTION
* applib_dt_get_tz_string
* DESCRIPTION
* Get timezone information of home city in +/- xx:xx format
* PARAMETERS
* result [IN/OUT] String pointer to store the result
* RETURNS
* void
*****************************************************************************/
void applib_dt_get_tz_string(kal_char *result)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_char tmpBuff[40];
kal_int16 homeTimeZone = (kal_int16) (GetTimeZone(PhnsetGetHomeCity()) * 4);
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
if (homeTimeZone < 0)
{
homeTimeZone = 0 - homeTimeZone;
sprintf(tmpBuff, "-%02d%02d", (homeTimeZone / 4), (homeTimeZone % 4) * 15);
}
else
{
sprintf(tmpBuff, "+%02d%02d", (homeTimeZone / 4), (homeTimeZone % 4) * 15);
}
strcpy(result, tmpBuff);
}
/*****************************************************************************
* FUNCTION
* applib_dt_conv_utc_to_local
* DESCRIPTION
* compute utc time to local time
* PARAMETERS
* tz [IN] Time zone
* utc_time [IN] Utc time
* RETURNS
* result of time
*****************************************************************************/
t_rtc applib_dt_conv_utc_to_local(float tz, t_rtc *utc_time)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
t_rtc outcome;
applib_time_struct origin_t;
applib_time_struct result_t;
float home_tz = GetTimeZone(PhnsetGetHomeCity());
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
tz = home_tz - tz;
origin_t.nYear = utc_time->rtc_year + YEARFORMATE;
origin_t.nMonth = utc_time->rtc_mon;
origin_t.nDay = utc_time->rtc_day;
origin_t.nHour = utc_time->rtc_hour;
origin_t.nMin = utc_time->rtc_min;
origin_t.nSec = utc_time->rtc_sec;
result_t = applib_dt_utc_to_rtc(tz, &origin_t);
outcome.rtc_year = result_t.nYear - YEARFORMATE;
outcome.rtc_mon = result_t.nMonth;
outcome.rtc_day = result_t.nDay;
outcome.rtc_hour = result_t.nHour;
outcome.rtc_min = result_t.nMin;
outcome.rtc_sec = result_t.nSec;
outcome.rtc_wday = result_t.DayIndex;
return outcome;
}
/*****************************************************************************
* FUNCTION
* applib_dt_mytime_2_utc_sec
* DESCRIPTION
* convert applib_time_struct format of time to seconds after 1970/1/1
* PARAMETERS
* currTime [?]
* daylightSaving [IN] If daylight saving should be considered.
* RETURNS
* void
*****************************************************************************/
kal_uint32 applib_dt_mytime_2_utc_sec(applib_time_struct *currTime, kal_bool daylightSaving)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_uint16 i;
kal_uint32 no_of_days = 0;
kal_int32 utc_time;
kal_int32 is_leap;
kal_uint8 dst;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
if (currTime->nYear < DT_UTC_BASE_YEAR)
{
return 0;
}
/* year */
for (i = DT_UTC_BASE_YEAR; i < currTime->nYear; i++)
{
no_of_days += (365 + applib_dt_is_leap_year(i));
}
/* month */
is_leap = applib_dt_is_leap_year(currTime->nYear);
for (i = 1; i < currTime->nMonth; i++)
{
no_of_days += applib_dt_last_day_of_mon((kal_uint8) i, currTime->nYear);
}
/* day */
no_of_days += (currTime->nDay - 1);
/* sec */
utc_time =
(kal_uint32) no_of_days *DT_SEC_PER_DAY + (kal_uint32) (currTime->nHour * DT_SEC_PER_HOUR +
currTime->nMin * DT_SEC_PER_MIN + currTime->nSec);
dst = applib_dt_is_dst_enabled();
if (dst && daylightSaving)
{
utc_time -= DT_SEC_PER_HOUR;
}
return utc_time;
}
/*****************************************************************************
* FUNCTION
* applib_dt_utc_sec_2_mytime
* DESCRIPTION
* convert from UTC second to applib_time_struct struct
* PARAMETERS
* utc_sec [IN] Uct_sec
* result [IN] Result of time
* daylightSaving [IN] If daylight saving should be considered.
* RETURNS
* KAL_TRUE if success; otherwise, KAL_FALSE.
*****************************************************************************/
kal_uint8 applib_dt_utc_sec_2_mytime(kal_uint32 utc_sec, applib_time_struct *result, kal_bool daylightSaving)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_int32 sec, day;
kal_uint16 y;
kal_uint8 m;
kal_uint16 d;
kal_uint8 dst;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
dst = applib_dt_is_dst_enabled();
if (dst && daylightSaving)
{
utc_sec += DT_SEC_PER_HOUR;
}
/* hour, min, sec */
/* hour */
sec = utc_sec % DT_SEC_PER_DAY;
result->nHour = sec / DT_SEC_PER_HOUR;
/* min */
sec %= DT_SEC_PER_HOUR;
result->nMin = sec / DT_SEC_PER_MIN;
/* sec */
result->nSec = sec % DT_SEC_PER_MIN;
/* year, month, day */
/* year */
/* year */
day = utc_sec / DT_SEC_PER_DAY;
for (y = DT_UTC_BASE_YEAR; day > 0; y++)
{
d = (DT_DAY_PER_YEAR + applib_dt_is_leap_year(y));
if (day >= d)
{
day -= d;
}
else
{
break;
}
}
result->nYear = y;
for (m = 1; m < DT_MONTH_PER_YEAR; m++)
{
d = applib_dt_last_day_of_mon(m, y);
if (day >= d)
{
day -= d;
}
else
{
break;
}
}
result->nMonth = m;
result->nDay = (kal_uint8) (day + 1);
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* applib_dt_rfc1123_rfc850_asctime_dateString2Time
* DESCRIPTION
* This function is used to convert rfc1123, rfc850 and asctime date string to time seconds.
* PARAMETERS
* date [IN]
* time [IN/OUT] The time seconds for date_str
* date_str(?) [IN] The rfc1123 date string
* RETURNS
* KAL_TRUE: Success
* KAL_FALSE: Wrong Format
*****************************************************************************/
kal_bool applib_dt_rfc1123_rfc850_asctime_dateString2Time(const kal_char *date, kal_uint32 *time)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_uint16 year = 0;
kal_uint16 month = 0;
kal_uint16 day = 0;
kal_uint16 wkday = 0;
kal_uint16 hours = 0;
kal_uint16 mins = 0;
kal_uint16 secs = 0;
kal_uint16 leap_year = 0;
kal_char *str1, *str2, *pp;
kal_uint32 i;
kal_char date_str[100];
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
if (date == NULL || strlen(date) > 99)
{
return KAL_FALSE;
}
else
{
strcpy(date_str, date);
}
if ((str1 = strchr(date_str, ',')) != NULL)
{
*str1 = '\0';
str1++;
/* The date_string may be rfc1123 or rfc850 date string */
for (i = 0; i < 7; i++)
{
if (strcmp(date_str, weekday_c[i]) == 0 || strcmp(date_str, weekday_f[i]) == 0)
{
wkday = i;
if (i == 0)
{
wkday = 7;
}
}
}
if (wkday == 0) /* Wrong date format */
{
return KAL_FALSE;
}
str1++; /* Ingore one space */
if (strchr(str1, '-') != NULL)
{
/* The date_string may be rfc850 date string */
/* Retrieve day */
if (NULL == (str2 = kal_strtok_r(str1, "-", &pp)))
{
return KAL_FALSE;
}
day = atoi(str2);
/* Retrieve month */
if (NULL == (str2 = kal_strtok_r(NULL, "-", &pp)))
{
return KAL_FALSE;
}
for (i = 0; i < 12; i++)
{
if (strcmp(str2, months_c[i]) == 0 || strcmp(str2, months_f[i]) == 0)
{
month = i;
if (i == 0)
{
month = 12;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -