2011-06-07 18:07:28 u012901416 阅读数 35
unix_timestamp()函数的作用是返回一个确切的时间点的UNIX时间戳,这个Unix时间戳是一个无符号整数。unix_timestamp()函数有两种重载形式,一是不带任何参数,另外一个是带有一个Date或DateTime或TimeStamp类型的参数。

unix_timestamp(),返回自1970-1-1 8:00:00开始到当前系统时间为止的秒数。

unix_timestamp(date),返回1970-1-1 8:00:00开始到date所代表的时间为止的秒数,对于早于1970-1-1 8:00:00的时间,总是返回 0 。


select unix_timestamp(开始日期)-unix_timestamp(截至日期) form 表
2011-08-26 12:22:46 chiichen 阅读数 2377

Unix内核通过计算从1970年1月1日0点0分0秒纪元(UTC)开始经过的秒数来提供的基本时间和日期服务。在用户层,这个值是以time_t(在Unix中以t结尾的数据类型被称作基本系统数据类型,int的定义类型)数据类型标识的,一般被称作日历时间(calendar time),并通过函数time获得当前的值。

time函数原型:

#include <time.h>
time_t time(time_t *timeptr);

如果参数timeptr不为NULL的话则返回值也保存在它所指向的内存空间中。发生错误的话返回-1。

当获取这个值后,就可以通过调用其他函数来将它转换成可读的日期和时间,它们之间的关系如下图(来自Unix高级环境编程):


struct tm结构为:

 struct tm {        
     int  tm_sec;     // 秒 [0 - 60]
     int  tm_min;     // 分 [0 - 59] 
     int  tm_hour;    // 小时 [0 - 23] 
     int  tm_mday;    // 一月中的天数 [1 - 31] 
     int  tm_mon;     // 月 [0 - 11]
     int  tm_year;    // 从1900 年开始过的年数
     int  tm_wday;    // 星期 [0 - 6] 
     int  tm_yday;    // 一年中的天数 [0 - 365] 
     int  tm_isdst;   // 夏令时标志 <0不可用, 0非夏令时, >0为夏令时
   };

localtime、gmtime和mktime的函数原型

#include <time.h>
struct tm *gmtime(const time_t *calptr);
struct tm *localtime(const time_t *calptr);
time_t mktime(struct tm *tmptr);

localtime函数将日历时间转换成本地时间而购买time则转换为UTC时间,mktime则将本地时间转换为日历时间。

函数ctime和actime分别以time_t和struct tm的指针数据类型为参数,返回可读性很好的时间表示字符串,函数原型为

#include <time.h>
char *asctime(const struct tm *tmptr);
char *ctime(const time_t *calptr);

strftime函数类似于snprintf函数,但它是专用于存储转换时间和日期的,并定义有特定的format,函数原型:

#include <time.h>
size_t strftime(char *restrict buf, size_t maxsize, const char *restrict format, const struct tm *restrict tmptr);
前3个参数和snprintf函数相同,第四个参数为struct tm结构体(通常由time函数获得),具体的format可以通过manpage 3获得。


上述的所有函数只能提供秒级的精度,如果想获得更高的精度,则可以使用函数gettimeofday(微秒级精度)和clock_gettime函数(纳秒级精度)。不过它们都是基于单独的Unix规范和POSIX规范的。

gettimeofday函数原型和相关数据结构

#include <sys/time.h>
int gettimeofday(struct timeval *restrict tp, void *restrict tzp);

struct timeval {
           time_t tv_sec;    // 秒
           long   tv_usec;   // 微秒
};
参数tzp在目前单独Unix规范中只能是NULL。


clock_gettime函数:

#include <time.h>
int clock_gettime(clockid_t clk_id, struct timespec *tp);

struct timespec {
    time_t tv_sec;  // 秒
    long    tv_nsec;  // 纳秒
};
参数clk_id标识特定的时钟(系统时钟,进程特定时钟,线程特定时钟等),系统时钟所有进程可见。根据系统实现(硬件软件)的不同,获得的精度可能也是不同的,可以通过函数clock_getres获得特定系统的精度,而函数clock_settime则可以设定时钟,具体可从manpage 3获取。

将clk_id置为CLOCK_REALTIME则可以获得当前具体时间(从纪元开始)。

2017-08-06 22:41:27 yzhang6_10 阅读数 1312

时间和日期历程

UNIX内核提供的基本时间服务是计算自协调世界时(UTC)公元1970年1月1日00:00:00这一特定时间以来经过的描述。这种秒数是以数据类型time_t表示的,被称为日历时间。日历时间包括时间和日期。UNIX在这方面与其他操作系统的区别是:1)以协调统一时间而非本地时间计时;2)可自动进行转换,如变换到夏令时;3)将时间和日期作为一个量值保存。

time函数:返回当前时间和日期。

#include <time.h>
time_t time(time_t *calptr);
// 返回值:若成功,返回时间值;若出错,返回-1。

时间值作为函数值返回。如果参数非空,则时间值也存放在由calptr指向的单元内。

POSX1.1的实时扩展增加了对多个系统时钟的支持。在Single UNIX Specification V4中,控制这些时钟的接口从可选组被移至基本组。时钟通过clockid_t类型进行标识。下面将给出时钟类型标识符的标准值。

CLOC_REALTIME———******———实时系统时间
CLOCK_MONOTONIC——POSIX_MONOTONIC_CLOCK——不带负跳数的实时系统时间
CLOCK_PROCESS_CPUTIME_ID——_POSIX_CPUTIME——调用进程的CPU时间
CLOCK_THREAD_CPUTIME_ID——_POSIX_THREAD_CPUTIME——调用线程的CPU时间

clock_gettime函数可用于获取指定时钟的时间,返回的时间在timespec结构中,它把时间表示为以秒和纳秒。

#include <sys/time.h>
int clock_gettime(clockid_t clock_id, struct timespec *tsp);
// 返回值:若成功,返回0;若出错,返回-1。

当时钟ID设置为CLOCK_REALTIME时,clock_gettime函数提供了与time函数类似的功能,不过在系统支持高精度时间值得情况下,clock_gettime可能比time函数得到更高精度的时间值。

#include <sys/time.h>
int clock_getres(clockid_t clock_id, struct timespec *tsp);
// 返回值:若成功,返回0;若出错,返回-1。

clock_getres函数把参数tsp指向的timespec结构初始化为与clock_id参数对应的时钟精度。例如,如果精度为1毫秒,则tv_sec字段就是0,tv_nsec字段就是1000000。

要对特定的时钟设置时间,可以调用clock_settime函数。

#include <sys/time.h>
int clock_settime(clockid_t clock_id, const struct timespec *tsp);
// 返回值:若成功,返回0;若出错,返回-1。

我们需要适当的特权来更改时钟值,但是有些时钟是不能修改的。

SUSv4指定gettimeofday函数现在已弃用。然而一些程序仍然使用这个函数,因为与time函数相比,gettimeofday提供了更高的精度(可到微妙级)。

#include <sys/time.h>
int gettimeofday(struct timeval *restrict tp, void *restrict tzp);
// 返回值:总是返回0。

tzp的唯一合法值是NULL,其他值将产生不确定的结果。某些平台支持tzp说明区,但这完全依实现而定,Single UNIX Specification对此并没有定义。

gettimeofday函数以距特定时间(1970年1月1日00:00:00)的秒数的方式将当前时间存放在tp指向的timeval结构中,而该结构将当前时间表示为秒和微妙。

一旦取得这种从上述特定时间经过的秒数的整型时间值后,通常要调用函数将其转换为分解的时间结构,然后调用另一个函数生成人们可读的时间和日期。下图将说明各个时间函数之间的关系,其中localtime、mktime和strftime都受到环境变量TZ的影响。点画线表示了如何从时间相关的结构获得日历时间。

两个函数localtime和gmtime将日历时间转换成分解的时间,并将这些存放在一个tm结构中。

struct tm{
    int time_sec;   // [0-60]
    int tm_min;     // [0-59]
    int tm_hour;    // [0-23]
    int tm_mday;    // [1-31]
    int tm_mon;     // [1-11]
    int tm_year;    // [1990-...]
    int tm_wday;   // [ 0-6]
    int tm_yday;    // [0-365]
    int tm_isdst;   // <0,0>
};

秒可以超过59的理由是可以表示润秒。注意,除了月日字段,其他字段的值都以0开始。如果夏令时生效,则夏令标志值为正;若果非夏令时时间,则该标志值为0;如果此信息不可用,则其值为负。

#include <time.h>
struct tm *gmtime(const time_t *calptr);
struct tm *localtime(const time_t *calprt);
// 返回值:指向分解的tm结构的指针;若出错,返回NULL。

localtime和gmtime之间的区别是:localtime将日历时间转换成本地时间(考虑到本地时区和夏令时标志),而gmtime则将日历时间转换成协调统一时间的年、月、日、时、分、秒、周日分解结构。

函数mktime以本地时间的年、月、日等作为参数,将其变换成time_t值。

#include <time.h>
time_t mktime(struct tm *tmptr);
// 返回值:若成功,返回日历时间;若出错,返回-1。

函数strftime是一个类似于printf的时间值函数。它非常复杂,可以通过可用的多个参数来定制产生的字符串。

#include <time.h>
size_t strftime(char *restrict buf, size_t maxsize, const char *restirct format, const struct tm *restrict tmptr);
size_t strftime_t(char *restrict buf, size_t maxsize, const char *restrict format, const strcuct tm *restrict tmptr, locale_t locale);
// 返回值:若有空间,返回存入数组的字符串;否则,返回0。

strftime_l允许调用者将区域指定为参数,除此之外,strftime和strftime_t函数是相同。strftime使用通过TZ环境变量指定的区域。

tmptr参数是要格式化的时间值,由一个指向分解时间值tm结构的指针说明。格式化结果存放在一个长度为maxsize个字符的buf数组中,如果buf长度足以存放格式化结果及一个null终止符,则该函数返回在buf中存放的字符数(不包括null终止符);否则该函数返回0。

format参数控制时间值的格式。如同printf函数一样,转换说明的形式是百分号之后跟一个特定字符。format中的其他字符则按原样输出。两个连续的百分号在输出中产生一个百分号。与printf函数的不同之处是,每个转换说明产生一个不同的定长输出字符串,在format字符串中没有字段宽度修饰符。下面列出37中ISO C规定的转换说明。

%a——缩写的周日名——Thu
%A——全周日名——Thursday
%b——缩写的月名——Jan
%B——全月名——January
%c——日期和时间——Thu Jan 19 21:24:52 2012
%C——年/100(00~99)——20
%d——月日(01~31)——19
%D——日期(MM/DD/YY) 01/19/12
%e——月日(一位数字前加空格)(1~31)——19
%F——ISO 8601日期格式(YYYY-MM-DD)——2012-01-09
%g——ISO 8601基于周的年的最后2位数(00~99)
%G——ISO 8601基于周的年——2012
%h——与%b相同——Jan
%H——小时(24小时制)(00~23)——21
%I——小时(24小时制)(00-12)——09
%j——年日(001-366)——019
%m——月(01~12)——01
%M——分(00~59)——24
%n——换行符
%p——AM/PM——PM
%r——本地时间(12小时制)——09:24:52 PM
%R——与“%H:%M”相同——21:24
%S——秒:[00-60]——52
%t——视屏制表符
%T——与“%H:%M:%S”相同——21:24::52
%u——ISO 8601周几(Monday=1,1~7)——4
%U——星期日周数:(00-53)——03
%V——ISO 8601周数:(00~53)——03
%w——周几:(0=Sunday,0~6)——4
%W——星期一周数(00~53)——03
%x——本地日期——01/19/12
%X——本地时间——21:24:52
%y——年的最后两位数字(00~99)——12
%Y——年——2012
%z——ISO 8601格式的UTC偏移量——-0500
%Z——时区名——EST    
%%——翻译为1个%——%

strptime函数是strftime的反过来版本,把字符串时间转换成分解时间。

#include <time.h>
char *strptime(const char *restrict buf, const char *restrict format, struct tm *restrict tmptr);
// 返回值:指向上次解析的字符串的下一个字符的指针;否则,返回NULL。

format参数给出了buf参数指向的缓冲区内的字符串的格式。虽然与strftime函数的说明稍有不同,但格式说名是类似的。strptime函数转换说明符如下:

%a——缩写的或完整的周日名
%A——与%a相同
%b——缩写的或完整的月名
%B——与%b相同
%c——日期和时间
%C——年的最后两位数字
%d——周日:[01-31]
%D——日期[MM/DD/YY]
%e——与%d相同
%h——与&b相同
%H——小时(24小时制):[00-23]
%I——小时(12小时制):[01-12]
%j——年日:[001-366]
%m——月:[01-12]
%M——分:[00-59]
%n——任何空白
%p——AM/PM
%r——本地时间:(12小时制)
%R——与“%H:%M”相同
%S——秒:[00-60]
%t——任何空白
%T——与“%H:%M:%S”相同
%U——星期日周数:[00-53]
%w——周日:[0=Sunday,0-6]
%W——星期一周数:[00-53]
%x——本地日期
%X——本地时间
%y——年的最后两位数字:[00-99]
%Y——年
%%——翻译为1个%

localtime、mktime和strftime受环境变量TZ影响。如果定义了TZ,则这些函数将使用其值代替系统默认时区。如果TZ定义为空串(TZ=),则使用协调统一时间UTC。

参考文献

UNIX高级环境编程
2011-05-03 16:12:00 alongken2005 阅读数 5571

在mysql中把时间保持为unix时间戳可以提高代时间查询的sql语句速度,而且在不同时区转移数据可以更好的转换日期时间,但弊端就是在mysql管理器中看不到直观的日期时间,

mysql当然有解决的方法了 from_unixtime函数就是专门解决这个问题.用法如下:

UNIX时间戳转换为日期用函数: FROM_UNIXTIME()

select FROM_UNIXTIME(1156219870);


日期转换为UNIX时间戳用函数: UNIX_TIMESTAMP()

 

Select UNIX_TIMESTAMP(’2006-11-04 12:23:00′);


例:mysql查询当天的记录数:

 

$sql=”select * from message Where DATE_FORMAT(FROM_UNIXTIME(chattime),’%Y-%m-%d’) = DATE_FORMAT(NOW(),’%Y-%m-%d’) order by id desc”;

当然大家也可以选择在PHP中进行转换


UNIX时间戳转换为日期用函数: date()

 

date('Y-m-d H:i:s', 1156219870);


日期转换为UNIX时间戳用函数:strtotime()

strtotime('2010-03-24 08:15:42');

2009-09-15 17:22:04 JavaNoob 阅读数 369
unix_timestamp()获得当前秒数
unix_timestamp(date)获得指定日期的秒数

unix时间2038问题

阅读数 796

mysql UNIX时间戳与日期的相互转换

博文 来自: iteye_2832
没有更多推荐了,返回首页