summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorMeco Man <[email protected]>2021-07-18 14:34:35 +0800
committerMeco Man <[email protected]>2021-07-21 14:47:57 +0800
commit0f48449b5e326f4f66e443cbd1a0393ea00433e4 (patch)
tree0ae811a904fa8c83f1120cdd41b8bf5680baef7f /components
parent6c5546cc9c2103439dbe2e641f9f862868d2c9ab (diff)
[timezone] implement timezone
Diffstat (limited to 'components')
-rw-r--r--components/libc/Kconfig4
-rw-r--r--components/libc/compilers/common/sys/time.h7
-rw-r--r--components/libc/compilers/common/time.c41
3 files changed, 42 insertions, 10 deletions
diff --git a/components/libc/Kconfig b/components/libc/Kconfig
index a89b252caa..37a98ba836 100644
--- a/components/libc/Kconfig
+++ b/components/libc/Kconfig
@@ -59,9 +59,9 @@ if RT_USING_LIBC != y
default y
endif
-config RT_LIBC_FIXED_TIMEZONE
+config RT_LIBC_DEFAULT_TIMEZONE
depends on (RT_LIBC_USING_TIME || RT_USING_LIBC)
- int "Manually set a fixed time zone (UTC+)"
+ int "Set the default time zone (UTC+)"
range -12 12
default 8
diff --git a/components/libc/compilers/common/sys/time.h b/components/libc/compilers/common/sys/time.h
index bb1a9c96fd..4ca665c536 100644
--- a/components/libc/compilers/common/sys/time.h
+++ b/components/libc/compilers/common/sys/time.h
@@ -12,6 +12,7 @@
#define _SYS_TIME_H_
#include <rtconfig.h>
+#include <rtdef.h>
#include <time.h>
#ifdef __cplusplus
@@ -98,6 +99,12 @@ int clock_settime (clockid_t clockid, const struct timespec *tp);
int clock_time_to_tick(const struct timespec *time);
#endif /* RT_USING_POSIX */
+
+/* timezone APIs (Not standard LIBC APIs) */
+void rt_tz_set(rt_int8_t tz);
+rt_int8_t rt_tz_get(void);
+rt_int8_t rt_tz_is_dst(void);
+
#ifdef __cplusplus
}
#endif
diff --git a/components/libc/compilers/common/time.c b/components/libc/compilers/common/time.c
index e79a22b9db..8f4856a330 100644
--- a/components/libc/compilers/common/time.c
+++ b/components/libc/compilers/common/time.c
@@ -18,6 +18,7 @@
* 2021-02-12 Meco Man move all of the functions located in <clock_time.c> to this file
* 2021-03-15 Meco Man fixed a bug of leaking memory in asctime()
* 2021-05-01 Meco Man support fixed timezone
+ * 2021-07-21 Meco Man implement that change/set timezone APIs
*/
#include "sys/time.h"
@@ -32,10 +33,6 @@
#define DBG_LVL DBG_INFO
#include <rtdbg.h>
-#ifndef RT_LIBC_FIXED_TIMEZONE
-#define RT_LIBC_FIXED_TIMEZONE 8 /* UTC+8 */
-#endif
-
/* seconds per day */
#define SPD 24*60*60
@@ -202,7 +199,7 @@ struct tm *gmtime_r(const time_t *timep, struct tm *r)
r->tm_mon = i;
r->tm_mday += work - __spm[i];
- r->tm_isdst = 0;
+ r->tm_isdst = rt_tz_is_dst();
return r;
}
RTM_EXPORT(gmtime_r);
@@ -218,7 +215,7 @@ struct tm* localtime_r(const time_t* t, struct tm* r)
{
time_t local_tz;
- local_tz = *t + RT_LIBC_FIXED_TIMEZONE * 3600;
+ local_tz = *t + rt_tz_get() * 3600;
return gmtime_r(&local_tz, r);
}
RTM_EXPORT(localtime_r);
@@ -235,7 +232,7 @@ time_t mktime(struct tm * const t)
time_t timestamp;
timestamp = timegm(t);
- timestamp = timestamp - 3600 * RT_LIBC_FIXED_TIMEZONE;
+ timestamp = timestamp - 3600 * rt_tz_get();
return timestamp;
}
RTM_EXPORT(mktime);
@@ -426,7 +423,7 @@ int gettimeofday(struct timeval *tv, struct timezone *tz)
if(tz != RT_NULL)
{
tz->tz_dsttime = DST_NONE;
- tz->tz_minuteswest = -(RT_LIBC_FIXED_TIMEZONE * 60);
+ tz->tz_minuteswest = -(rt_tz_get() * 60);
}
if (tv != RT_NULL && get_timeval(tv) == RT_EOK)
@@ -651,3 +648,31 @@ int clock_time_to_tick(const struct timespec *time)
RTM_EXPORT(clock_time_to_tick);
#endif /* RT_USING_POSIX */
+
+
+/* timezone APIs (Not standard LIBC APIs) */
+#ifndef RT_LIBC_DEFAULT_TIMEZONE
+#define RT_LIBC_DEFAULT_TIMEZONE 8
+#endif
+
+#include <rthw.h>
+
+volatile static rt_int8_t rt_current_timezone = RT_LIBC_DEFAULT_TIMEZONE;
+
+void rt_tz_set(rt_int8_t tz)
+{
+ register rt_base_t level;
+ level = rt_hw_interrupt_disable();
+ rt_current_timezone = tz;
+ rt_hw_interrupt_enable(level);
+}
+
+rt_int8_t rt_tz_get(void)
+{
+ return rt_current_timezone;
+}
+
+rt_int8_t rt_tz_is_dst(void)
+{
+ return 0;
+}