用C语言获取本地的时区

用C语言获取本地的时区,第1张

getlocaltime里面是没有时区信息的。

你可以这样:

time_t time_utc = 0;

struct tm p_tm_time;

int time_zone = 0;

p_tm_time = localtime( &time_utc );   //转成当地时间

time_zone = ( p_tm_time->tm_hour > 12 )    ( p_tm_time->tm_hour-=  24 )  :  p_tm_time->tm_hour;

把0时间转为当地时间,得到的是带时区的结果。

查看文件时间戳命令:stat awktxt

File: `awktxt'

Size: 20 Blocks: 8 IO Block: 4096 regular file

Device: 801h/2049d Inode: 380730 Links: 1

Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)

Access: 2008-04-26 01:50:44000000000 +0800

Modify: 2008-04-26 01:48:18000000000 +0800

Change: 2008-04-26 01:48:18000000000 +0800

说明:Access访问时间。Modify修改时间。Change状态改变时间。可以stat 查看这个目录所有文件的状态。

现在是要过滤出Modify的时间戳,并以yyyyMMddHHSS格式保存,则可以利用下面这条命令:

stat awktxt | grep -i Modify | awk -F '{print $1}' | awk '{print $2$3}'| awk -F- '{print $1$2$3}' | awk -F: '{print $1$2$3}'

输出结果:20080426014818

建议楼主下载《Linux就该这么学》,里面有很全面、很系统、很实用的命令介绍,图文形式的,非常适合初学者的。

希望可以帮到您!

在编译Linux内核,配置时:make menuconfig ---> Kernel hacking --> show timing information on printks

当选中这个选项后,启动内核,会在日志信息前面加上时间戳。

从下面的输出可以看出,时间精确到微秒(us)。

如下:

-------------------------------------------------------------------------------------------

Uncompressing Linux done, booting the kernel

[ 0000000] Linux version 26357+ (bshen@bamboo) (gcc version 441 (Sourcery G++ Lite 2010q1-202) ) #109 PREEMPT Mon Nov 14 15:11:15 CST 2011

[ 0000000] CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177

[ 0000000] CPU: VIVT data cache, VIVT instruction cache

--------------------------------------------------------------------------------------------

1 前言

在linux 26内核中对于网络数据包中的时间戳处理和24相比有了不少变化,如果原样照搬24就要出错

了。

2 26中的tstamp

24中skb的时间戳直接就用struct timeval结构,而且使用时直接访问该参数。

26中的时间戳已经改为skb专用的时间结构struct skb_timeval:

struct sk_buff {

struct skb_timeval tstamp;

};

定义如下:

struct skb_timeval {

u32 off_sec;

u32 off_usec;

};

和24区别就是强调了参数是32位无符号数,时间是相对于一个基准时间的偏差,基准点可以自己定义,

通常还是按UNIX的缺省基准时间;而在timeval中定义的是long,在64位系统中将是64位,而且是有符

号的,时间是绝对时间,即基准点是固定的。

在 include/linux/skbuffh 中提供以下两个函数接口来获取和设置skb的时间戳:

/

skb_get_timestamp - get timestamp from a skb

@skb: skb to get stamp from

@stamp: pointer to struct timeval to store stamp in

Timestamps are stored in the skb as offsets to a base timestamp

This function converts the offset back to a struct timeval and stores

it in stamp

/

static inline void skb_get_timestamp(const struct sk_buff skb, struct timeval stamp)

{

stamp->tv_sec = skb->tstampoff_sec;

stamp->tv_usec = skb->tstampoff_usec;

}

/

skb_set_timestamp - set timestamp of a skb

@skb: skb to set stamp of

@stamp: pointer to struct timeval to get stamp from

Timestamps are stored in the skb as offsets to a base timestamp

This function converts a struct timeval to an offset and stores

it in the skb

/

static inline void skb_set_timestamp(struct sk_buff skb, const struct timeval stamp)

{

skb->tstampoff_sec = stamp->tv_sec;

skb->tstampoff_usec = stamp->tv_usec;

}

3 记录时间

24中skb的时间戳是自动记录的,获取skb后就能直接读取其进入系统的时间。

而在26中,是否记录时间戳成为可选的,大概因为很多网络应用中用不到skb的内部时间,为其赋值将

增加系统的开销,系统增加了一个静态参数netstamp_needed来控制是否记录时间戳。

/ net/core/devc /

/ When > 0 there are consumers of rx skb time stamps /

static atomic_t netstamp_needed = ATOMIC_INIT(0);

// 允许记录时间戳

void net_enable_timestamp(void)

{

atomic_inc(&netstamp_needed);

}

// 停止记录时间戳

void net_disable_timestamp(void)

{

atomic_dec(&netstamp_needed);

}

// 设置时间戳

void __net_timestamp(struct sk_buff skb)

{

struct timeval tv;

do_gettimeofday(&tv);

skb_set_timestamp(skb, &tv);

}

EXPORT_SYMBOL(__net_timestamp);

static inline void net_timestamp(struct sk_buff skb)

{

if (atomic_read(&netstamp_needed))

// 有需要时才设置时间戳

__net_timestamp(skb);

else {

// 否则时间戳值为0

skb->tstampoff_sec = 0;

skb->tstampoff_usec = 0;

}

}

在发包函数dev_queue_xmit_nit()和收包函数nettf_rx(),netif_receive_skb()中就调用了

net_timestamp()函数来设置时间戳,而缺省情况下不记录时间戳,要使系统记录时间戳必须模块中调用

net_enable_timestamp()来允许记录时间戳,模块退出时调用net_disable_timestamp()停止记录。

3 结论

对于安全设备,要识别flood、scan等攻击都要用到时间上的统计信息,所以时间戳是必须的,而如果是从24移植到26,就必须增加net_enable_timestamp()打开时间戳记录,否则将会发现时间戳都是0而使统计失败,而如果没仔细检查时间戳值的话,真是死都不知道是怎么死的。

如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)?

先上代码进行java时间转换成unix timestamp

[html] view plaincopy

import javatextDateFormat;

import javatextParseException;

import javatextSimpleDateFormat;

import javautilDate;

/

@author kongqz kongqingzhu@gmailcom

@version 创建时间:2013-2-19 上午10:21:47

/

public class TestUnixTime {

public static void main(String[] args) throws ParseException{

DateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

//1361325960

long epoch = dfparse("2013-02-20 10:06:00")getTime();

Systemoutprintln("should be 1361325960 :"+epoch);

Date d=new Date();

String t=dfformat(d);

epoch=dfparse(t)getTime()/1000;

Systemoutprintln("t is :"+t+",unix stamp is "+epoch);

}

}

Java time

JavaScript Mathround(new Date()getTime()/1000)

getTime()返回数值的单位是毫秒

Microsoft NET / C# epoch = (DateTimeNowToUniversalTime()Ticks - 621355968000000000) / 10000000

MySQL SELECT unix_timestamp(now())

Perl time

PHP time()

PostgreSQL SELECT extract(epoch FROM now())

Python 先 import time 然后 timetime()

Ruby 获取Unix时间戳:Timenow 或 Timenew

显示Unix时间戳:Timenowto_i

SQL Server SELECT DATEDIFF(s, '1970-01-01 00:00:00', GETUTCDATE())

Unix / Linux date +%s

VBScript / ASP DateDiff("s", "01/01/1970 00:00:00", Now())

其他 *** 作系统

(如果Perl被安装在系统中) 命令行状态:perl -e "print time"

如何在不同编程语言中实现Unix时间戳(Unix timestamp) → 普通时间?

Java String date = new javatextSimpleDateFormat("dd/MM/yyyy HH:mm:ss")format(new javautilDate(Unix timestamp 1000))getTime();

JavaScript 先 var unixTimestamp = new Date(Unix timestamp 1000)然后 commonTime = unixTimestamptoLocaleString()

Linux date -d @Unix timestamp

MySQL from_unixtime(Unix timestamp)

Perl 先 my $time = Unix timestamp 然后 my ($sec, $min, $hour, $day, $month, $year) = (localtime($time))[0,1,2,3,4,5,6]

PHP date('r', Unix timestamp)

PostgreSQL SELECT TIMESTAMP WITH TIME ZONE 'epoch' + Unix timestamp) INTERVAL '1 second';

Python 先 import time 然后 timegmtime(Unix timestamp)

Ruby Timeat(Unix timestamp)

SQL Server DATEADD(s, Unix timestamp, '1970-01-01 00:00:00')

VBScript / ASP DateAdd("s", Unix timestamp, "01/01/1970 00:00:00")

其他 *** 作系统

(如果Perl被安装在系统中) 命令行状态:perl -e "print scalar(localtime(Unix timestamp))"

如何在不同编程语言中实现普通时间 → Unix时间戳(Unix timestamp)?

Java long epoch = new javatextSimpleDateFormat("dd/MM/yyyy HH:mm:ss")parse("01/01/1970 01:00:00");

JavaScript var commonTime = new Date(DateUTC(year, month - 1,day,hour,minute,second))

MySQL SELECT unix_timestamp(time)

时间格式: YYYY-MM-DD HH:MM:SS 或 YYMMDD 或 YYYYMMDD

Perl 先 use Time::Local 然后 my $time = timelocal($sec, $min, $hour, $day, $month, $year);

PHP mktime(hour, minute, second, day,month,year)

PostgreSQL SELECT extract(epoch FROM date('YYYY-MM-DD HH:MM:SS'));

Python 先 import time 然后 int(timemktime(timestrptime('YYYY-MM-DD HH:MM:SS', '%Y-%m-%d %H:%M:%S')))

Ruby Timelocal(year, month, day, hour,minute,second)

SQL Server SELECT DATEDIFF(s, '1970-01-01 00:00:00', time)

Unix / Linux date +%s -d"Jan 1, 1970 00:00:01"

VBScript / ASP DateDiff("s", "01/01/1970 00:00:00", time)

以上就是关于用C语言获取本地的时区全部的内容,包括:用C语言获取本地的时区、linux如何得到一个文件的最后修改时间、linux 内核怎么打印系统时间戳等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9809603.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存