RTC時(shí)間操作:
創(chuàng)新互聯(lián)是一家專業(yè)提供永勝企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、HTML5、小程序制作等業(yè)務(wù)。10年已為永勝眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。
1.rtc時(shí)間是由rtc硬件控制的,所以在linux中想要修改和獲取rtc時(shí)間就只能通過驅(qū)動的接口來獲取和修改。
intrtc_test(void)
{
structrtc_timertc;
intfd=-1;
intret=-1;
fd=open("/dev/rtc0",O_RDWR);
if(fd0){
return-1;
}
ret=ioctl(fd,RTC_RD_TIME,rtc);
if(ret0){
return-1;
}
printf("\nCurrentRTCdata/timeis%d-%d-%d,%02d:%02d:%02d.\n",rtc.tm_mday,rtc.tm_mon+1,
rtc.tm_year+1900,rtc.tm_hour,rtc.tm_min,rtc.tm_sec);
ret=ioctl(fd,RTC_SET_TIME,rtc);
if(ret0){
return-1;
}
return0;
}
2.除了上面這種方式操作rtc時(shí)間以外,linux中也有一個(gè)命令可以簡化rtc時(shí)間操作,hwclock,比如,可以通過system("hwclock-w");系統(tǒng)調(diào)用來把xtime設(shè)置到rtc硬件。
墻上時(shí)間(realtime、xtime):
linux系統(tǒng)中主要使用的就是xtime,它是系統(tǒng)運(yùn)行的基礎(chǔ),很多程序都是依賴于xtime來運(yùn)行的,接下來將介紹將如何操作xtime。
1.獲取、設(shè)置微秒級別的時(shí)間:
#include
#include
structtimeval
{
inttv_sec;
inttv_usec;
};
intgettimeofday(structtimeval*tv,structtimezone*tz);
intsettimeofday(conststructtimeval*tv,conststructtimezone*gz);
功能描述:
gettimeofday()獲取當(dāng)前時(shí)間,有tv指向的結(jié)構(gòu)體返回。
settimeofday()把當(dāng)前時(shí)間設(shè)成由tv指向的結(jié)構(gòu)體數(shù)據(jù)。當(dāng)前地區(qū)信息則設(shè)成tz指向的結(jié)構(gòu)體數(shù)據(jù)。
2.獲取秒級別的時(shí)間
typedeflongtime_t;
time_ttime(time_t*t);
如果t是non-null,它將會把時(shí)間值填入t中
3.內(nèi)核2.6版本后新增的clockapi接口
獲取納秒級別的時(shí)間
structtimespec{
time_ttv_sec;/*秒s*/
longtv_nsec;/*納秒ns*/
};
intclock_getres(clockid_tclk_id,structtimespec*res);
intclock_gettime(clockid_tclk_id,structtimespec*tp);
intclock_settime(clockid_tclk_id、conststructtimespec*tp);
編譯連接時(shí)采用-lrt才能編譯通過。
clk_id可選參數(shù):
CLOCK_REALTIME
系統(tǒng)全局的實(shí)時(shí)時(shí)鐘.設(shè)置此時(shí)鐘需要合適的權(quán)限.
CLOCK_MONOTONIC
只能被讀取,無法被設(shè)置,表示monotonic時(shí)間起點(diǎn).
CLOCK_PROCESS_CPUTIME_ID
從cpu每進(jìn)程的高分辨率計(jì)時(shí)器.
CLOCK_THREAD_CPUTIME_ID
線程的特定cpu時(shí)間時(shí)鐘.
系統(tǒng)啟動時(shí),會首先從rtc中讀取rtc時(shí)間,并設(shè)置給xtime,而當(dāng)ntp對系統(tǒng)時(shí)間進(jìn)行更新時(shí),首先設(shè)置xtime,然后調(diào)用hwclock設(shè)置到rtc硬件中。xtime根據(jù)需要的精度,可以通過上面幾個(gè)接口來選擇使用。
這樣。不過只是個(gè)精確到納秒的計(jì)時(shí)器,不是精確到納秒的當(dāng)前時(shí)間。windows好像只能拿到ms精度的當(dāng)前時(shí)間吧,不是很清楚。
package main
import (
"syscall"
"time"
"unsafe"
)
func NewStopWatch() func() time.Duration {
var QPCTimer func() func() time.Duration
QPCTimer = func() func() time.Duration {
lib, _ := syscall.LoadLibrary("kernel32.dll")
qpc, _ := syscall.GetProcAddress(lib, "QueryPerformanceCounter")
qpf, _ := syscall.GetProcAddress(lib, "QueryPerformanceFrequency")
if qpc == 0 || qpf == 0 {
return nil
}
var freq, start uint64
syscall.Syscall(qpf, 1, uintptr(unsafe.Pointer(freq)), 0, 0)
syscall.Syscall(qpc, 1, uintptr(unsafe.Pointer(start)), 0, 0)
if freq = 0 {
return nil
}
freqns := float64(freq) / 1e9
return func() time.Duration {
var now uint64
syscall.Syscall(qpc, 1, uintptr(unsafe.Pointer(now)), 0, 0)
return time.Duration(float64(now-start) / freqns)
}
}
var StopWatch func() time.Duration
if StopWatch = QPCTimer(); StopWatch == nil {
// Fallback implementation
start := time.Now()
StopWatch = func() time.Duration { return time.Since(start) }
}
return StopWatch
}
func main() {
// Call a new stop watch to create one from this moment on.
watch := NewStopWatch()
// Do some stuff that takes time.
time.Sleep(1)
// Call the stop watch itself and it will return a time.Duration
dur := watch()
}
這和語言沒關(guān)系,操作系統(tǒng)要提供這樣的原語。linux和windows都是可以的。
C語言獲取當(dāng)前系統(tǒng)時(shí)間的幾種方式
C語言獲取系統(tǒng)時(shí)間的幾種方式
C語言中如何獲取時(shí)間?精度如何?
1 使用time_t time( time_t * timer ) 精確到秒
2 使用clock_t clock() 得到的是CPU時(shí)間精確到1/CLOCKS_PER_SEC秒
3 計(jì)算時(shí)間差使用double difftime( time_t timer1, time_t timer0 )
4 使用DWORD GetTickCount() 精確到毫秒
5 如果使用MFC的CTime類,可以用CTime::GetCurrentTime() 精確到秒
6 要獲取高精度時(shí)間,可以使用
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)
獲取系統(tǒng)的計(jì)數(shù)器的頻率
BOOL QueryPerformanceCounter(LARGE_INTEGER
*lpPerformanceCount)
獲取計(jì)數(shù)器的值
然后用兩次計(jì)數(shù)器的差除以Frequency就得到時(shí)間。
7 Multimedia Timer Functions
The following functions are used with multimedia timers.
timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime