參考資料:
https://kernel.googlesource.com/pub/scm/utils/util-linux/util-linux/+/v2.11b/hwclock/rtc.c
讀取
#include <ctime> #include <sys/time.h> #include <linux/rtc.h> #include <sys/ioctl.h> void get_rtc(void) { char buf[80] = {0}; int fd = open("/dev/rtc", O_RDWR); if (fd > 0) { struct tm tstruct = {0}; ioctl(fd, RTC_RD_TIME, &tstruct); close(fd); time_t t = mktime(&tstruct); struct timeval tv = {t, 0}; settimeofday(&tv, NULL); system("hwclock --systohc &"); strftime(buf, sizeof(buf), "%F %R", &tstruct); } }
更新
#include <ctime> #include <sys/time.h> #include <linux/rtc.h> #include <sys/ioctl.h> void set_rtc(const char* timestamp) { int imonth, iday, iyear, ihour, iminute; sscanf(timestamp, "%d-%d-%d %d:%d", &iyear, &imonth, &iday, &ihour, &iminute); struct tm datetime = {0}; datetime.tm_year = iyear - 1900; datetime.tm_mon = imonth - 1; datetime.tm_mday = iday; datetime.tm_hour = ihour; datetime.tm_min = iminute; datetime.tm_sec = 0; if (datetime.tm_year < 0) { datetime.tm_year = 0; } time_t t = mktime(&datetime); struct timeval tv = {t, 0}; settimeofday(&tv, NULL); system("hwclock --systohc &"); int fd = open("/dev/rtc", O_RDWR); if (fd > 0) { ioctl(fd, RTC_SET_TIME, t); close(fd); } }