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 内核怎么打印系统时间戳等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)