Linux修改時區、獲取時間、設置時間

 

時區設置(北京時間:選擇亞洲-上海)

方法一:通過修改文件系統

查看當前開發板“亞洲-上海”時區的路徑:

root@imx6qsabresd:/usr/share/zoneinfo/Asia# ls
Dhaka  Dubai  Hong_Kong  Karachi  Shanghai  Tokyo

系統通過讀取/etc/localtime來設置當前時區,由下面可知當前設置的是世界時間,不是北京時間(世界時間偏移+8小時)

root@imx6qsabresd:/etc# ls -al localtime 
lrwxrwxrwx  1 root root    29 Jan  1  1970 localtime -> /usr/share/zoneinfo/Universal

通過執行軟鏈接命令(ln -s),使/etc/localtime文件中寫入的是想要設置的時區的路徑,比如:

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
root@imx6qsabresd:/etc# ls -al
lrwxrwxrwx  1 root root    33 Jun  3 10:37 localtime -> /usr/share/zoneinfo/Asia/Shanghai

此時,時區已經設置亞洲上海了(北京時間),用這個開發板中的localtime文件替換掉源碼中/rootfs/etc/localtime文件即可,因爲這個文件中的內容就是目標時區的路徑。

方法二:通過shell命令

tzselect 命令也可以修改時區,但是需要系統支持這個命令。

方法三:通過庫函數

setenv(“TZ”, “GMT+0”, 1);//將當前時區設置成標準區 

setenv(“TZ”, “GMT-8”, 1); 表示的意思就是:將當前時區設置成東八區。需要注意的是,這裏要寫成GMT-8纔是東八區,不是GMT+8,原因GMT表示時間的方式有點不同,它的格式是(GMT[+/-]offset), 如果目標時區是在東區,則是負的,否則是正的。意思就是本地時區加減多少(offset)才能得到標準時間。

原文:https://blog.csdn.net/u013457167/article/details/79021913 

時間相關的庫函數和結構體

linux下常用時間類型有四種: time_t (long 類型)、 struct   tm、 struct  timeval 、  struct   timespec

Linux下常用時間函數有:time( )、ctime( )、gmtime( )、localtime( )、mktime( )、asctime( )、difftime( )、gettimeofday( )、settimeofday( )

ANSI C標準稱使用tm結構的這種時間表示爲分解時間(broken-down time)

gmtime() 和 localtime()   將time_t 時間(時間戳、秒數)類型轉換爲tm結構體;

mktime()   將tm結構體轉換爲time_t時間類型;

gettimeofday()   獲取系統時間戳-time_t時間類型,不需要輸入tm結構體

asctime()   將struct tm轉換爲字符串形式;

各個函數的詳細使用說明可以參考:https://www.cnblogs.com/chris-cp/p/3760000.html

獲取時間戳(從1970-01-01 00:00:00到現在經歷的秒數)

方法一:shell命令(C代碼中不建議使用shell命令獲取,而應使用庫函數)

root@imx6qsabresd:~# date +%s
1562582564

方法二:庫函數

int gettimeofday(struct timeval *tv, struct timezone *tz)

其中,頭文件是

 #include <sys/time.h>

結構體說明

struct timeval{  
    long int tv_sec; // 秒數  
    long int tv_usec; // 微秒數  
} 

timezone 參數若不使用則傳入NULL即可,應用如下

#include<iostream>
#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>

int main(){
    struct timeval tv;
    gettimeofday(&tv,NULL);

    printf("second:%ld\n",tv.tv_sec);  //秒
    printf("millisecond:%ld\n",tv.tv_sec*1000 + tv.tv_usec/1000);  //毫秒
    printf("microsecond:%ld\n",tv.tv_sec*1000000 + tv.tv_usec);  //微秒

    return 0;
}

方法三:庫函數

輸入 tm 時間結構體

time_t mktime(struct tm *)     //typedef  long  time_t
    struct tm tptr;
    struct timeval tv;

    tptr.tm_year = year - 1900;
    tptr.tm_mon = month - 1;
    tptr.tm_mday = day;
    tptr.tm_hour = hour;
    tptr.tm_min = min;
    tptr.tm_sec = sec;

    tv.tv_sec = mktime(&tptr);  //mktime()返回1970-1-1到當前時間的秒數
    tv.tv_usec = 0;   //微秒

獲取時間-年月日時分秒

unsigned char timebuf[20] = {0};

struct tm *t;
time_t tt;
time(&tt);
t = localtime(&tt);

snprintf(timebuf, 20, "%4d-%02d-%02d %02d:%02d:%02d", 
       t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);

printf("timebuf=%s\r\n",timebuf);

結構體說明:

struct tm {
    int tm_sec;/* 秒 - 取值區間爲[0,59] */
    int tm_min; /* 分 - 取值區間爲[0,59] */
    int tm_hour; /* 時 - 取值區間爲[0,23] */
    int tm_mday; /* 一個月中的日期 - 取值區間爲[1,31] */
    int tm_mon; /* 月份 (從一月開始,0代表一月) - 取值區間爲[0,11] */
    int tm_year; /* 年份,其值等於實際年份減去1900 */
    int tm_wday; /* 星期 - 取值區間爲[0,6],其中0代表星期天,1代表星期一,以此類推 */
    int tm_yday; /* 從每年的1月1日開始的天數 - 取值區間爲[0,365],其中0代表1月1日,1代表1月2日,以此類推 */
    int tm_isdst; /* 夏令時標識符,實行夏令時的時候,tm_isdst爲正。不實行夏令時的時候,tm_isdst爲0;不瞭解情況時,tm_isdst()爲負. */
}

設置時間

方法一:settimeofday

輸入時間戳,通過settimeofday()函數來設置系統時間,這個函數設置的精度可以精確到微秒。

#include <time.h>
int settimeofday(const struct timeval *tv , const struct timezone *tz);

 參數說明:

struct timeval {
    time_t      tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* microseconds */
};

struct timezone {
    int tz_minuteswest;     /* minutes west of Greenwich */
    int tz_dsttime;         /* type of DST correction */
};

tz參數爲時區,時區結構中tz_dsttime在linux中不支持,應該置爲0,通常將參數tz設置爲NULL,表示使用當前系統的時區。該函數是glib中的。


方法二:int stime(time_t *t)

輸入時間戳即可設置時間,比如設置現在時間爲2019年7月9日14點51分30秒   

SetSysTime(2019,7,9,14,51,30); 
void SetSysTime(int year, int mon, int days, int hour, int min, int sec){
	time_t t; //存放時間戳(秒數)
	struct tm timeNow = {0};

	timeNow.tm_sec = sec; //0-60
	timeNow.tm_min = min; //0-59
	timeNow.tm_hour = hour; //0-23
	timeNow.tm_mday = days; //1-31
	timeNow.tm_mon = mon-1; //0-11
	timeNow.tm_year = year-1900;
	timeNow.tm_isdst = -1; //夏令時標誌符,don't know:-1,off:0,on:1

	t = mktime(&timeNow); //返回時間戳
	stime(&t); //設置時間
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章