如何在不同编程语言中获取现在的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)
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而使统计失败,而如果没仔细检查时间戳值的话,真是死都不知道是怎么死的。
public static void main(String[] args) {
// 创建对象
long sTime = SystemcurrentTimeMillis();
for (int i = 0; i < 1000000; i++) {
Systemoutprintln(i);
}
long eTime = SystemcurrentTimeMillis();
Systemoutprintln(((eTime - sTime)/1000/60/60)+"小时");
}
获取时间戳。相减,再把毫秒转换成小时,OK
获取前系统UNIX间戳
Systemoutprintln("获取系统毫秒数1:"+LongtoString(new Date()getTime()));
Systemoutprintln("获取系统毫秒数2:"+LongtoString(SystemcurrentTimeMillis()));
注意:代码获取都系统毫秒数实际 *** 作我般都记录毫秒说求记录精度处理UNIX间戳候需要数据进行处理
import javatextSimpleDateFormat;
import javautilDate;
public class Test2 {
/
@param args
/
public static void main(String[] args) {
Date date = new Date();
Systemoutprintln(date);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Systemoutprintln(dfformat(date));
}
}
在iOS中我们经常需要使用到时间戳,但在iOS下获取“时间”的方法有很多。不过总的来说,我们可以在iOS中获取的时间戳主要有两类----绝对时间与相对时间。下面将总结一下这些方法之间的关系。
绝对时间是指那些以固定时间为参考系的时间戳。
常用的有Foundation框架中的
[[NSDate date] timeIntervalSinceReferenceDate];
以及CoreFoundation框架中的
CFAbsoluteTimeGetCurrent();
上述两种方法是等价的,所参考的起始时间都是世界时间(UTC)2001年1月1日凌晨,所返回的double类型的结果都是从参考时间至今经过的秒数。
除了刚才提到的参考时间,还有以世界时间(UTC)1970年1月1日凌晨为参考系的
[[NSDate date] timeIntervalSince1970];
由于参考系是固定的,显然每次通过这些方法获取的时间戳都将是不同的。但绝对不变的参考系并不意味着绝对可靠的结果,实际上当用户手动改变了设备上的系统时间后,基于系统时钟的上述方法返回的结果也会一同改变。
假如我们想获取一种不会被用户手动修改而影响的时间戳,该怎么办?答案是相对时间。
相对时间是指以非固定时间为参考系返回的时间戳
常用的有Foundation框架中的
[[NSProcessInfo processInfo] systemUptime];
和QuartzCore框架中的
CACurrentMediaTime();
上面两种方法获取到的都是设备自最近一次启动至今经过的时间戳。 CFAbsoluteTimeGetCurrent() 方法调用底层的 mach_absolute_time() 方法后将结果转换成秒返回。该结果是设备自最近一次启动至今经过的时间,不随系统时间改变而改变,但当设备重启后,该方法返回的结果也会重置。
两类时间戳都有各自的特点:
绝对时间参考固定的时间点返回时间戳但结果会受系统时钟的影响;
相对时间在设备不重启的情况下总能正确返回某一时间段内流逝的时间;
所以具体要使用哪种方法获取时间戳需要结合不同的需求场景去选择。
获取到了时间戳,也许我们需要利用它来转换为时间并以一定的格式去展示,NSDate转NSString的方法网上有很多,在这里就不再叙述。需要注意的一点是,获取到绝对时间戳是以世界时间(UTC)为准的,NSDate中保存的日期也是以世界时间(UTC)为准的,所以在通过NSDateFormatter转换为NSString的时候一定要注意当前的时区。
如果App本身对获取的时间精度要求很高,还是直接通过网络从服务器获取时间戳会比较保险。当网络可用时,直接从服务器获取;网络不可用时,且设备没有被重启过,可以根据上一次获取服务器时间戳的时刻到此时的时间差来推算出正确的时间。
all-in-the-timing-keeping-track-of-time-passed-on-ios
以上就是关于如何在不同编程语言中获取现在的Unix时间戳全部的内容,包括:如何在不同编程语言中获取现在的Unix时间戳、用什么可以看到ip数据包内的时间戳呢、java 开发软件中,获取两个系统时间,相减,结婚以小时形式输出等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)