发表于2017年10月26日12:40最后回复于2017年10月26日12:40

分享一些对于日期类的操作的经验

852浏览量

2评论

    我们在爬虫采集过程中经常会涉及到对时间的操作,很多朋友对时间的操作都感觉到非常吃力,其实掌握了这些小技巧,你会发现时间操作还是非常简单的。

    首先我们应该了解一下时间的格式,前嗅爬虫中的时间格式是有两种的,一种是时间戳,网上的定义是这样的:时间戳是自1970年1月1日(08:00:00GMT)至当前时间的总毫秒数。它也被称为Unix时间戳(UnixTimestamp)。Unix时间戳(Unixtimestamp),或称Unix时间(Unixtime)、POSIX时间(POSIXtime),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数。Unix时间戳不仅被使用在Unix系统、类Unix系统中(比如Linux系统),也在许多其他操作系统中被广泛采用。在我们的爬虫系统中一般取的时间最多精确到秒,所以爬虫中的时间戳是从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。 

    另一种时间格式就是我们常见的年月日时分秒的表示方法,一般网站上显示出来的yyyy-mm-dd hh:mm:ss的格式,这种格式往往是字符串类型的,在数据存储上是不如时间戳好用的,ForeSpider爬虫软件中将这种格式进行了优化,用一个数字来表示年月日时分秒的格式,在这里我们不妨称之为应用日期格式。

    两种时间格式各有优劣,时间戳格式是long型的,拥有更高的效率,缺点是不直观;应用日期格式优点是直观,但是是string类型的,效率低。时间戳时间戳格式和应用日期格式可以相互转换的,能够灵活使用两种格式,那么对时间的操作就会非常简单了。

    了解了这些概念我们就来看一下ForeSpider软件中提供的时间类。时间time类目前有8个成员变量,8个操作方法。

time 类

time 类为时间操作类,一旦申明便创建一个时间对象,默认值为当前时间。

一.类成员:
成员名称 成员类型 是否静态 成员描述
year int 当前年份
month int 当前月份
day int 当前日期
week int 当前星期几
hour int 当前小时数
min int 当前分钟数
sec int 当前秒数
t0 int 返回当前时间对象从1970年的秒数
二.成员方法:
方法名称 返回值 是否静态 方法描述 参数表
Preday(n=1) time 返回当前时间的前n天时间 n:指定与今天偏离的天数,如果为负值则向后推
ToStr() string 把时间转换为yyyy-mm-dd hh:mm:ss
ToCn() long 把时间转换为yyyymmddhhmmss
GetCn() long 把当前时间转换为yyyymmddhhmmss
CnToStr(t) string 把cn时间转换为yyyy-mm-dd hh:mm:ss t:cn时间数值[yyyymmddhhmmss]
GetTime() int 返回当前的秒数【从1970-01-01 00:00:00】
time(t) int time类构造函数 t:从1970年到某时刻的秒数
time(year,month,day,hour,min,s) int time类构造函数 year,month,day,hour,min,s:可填写1到6个参数,分别对应年、月、日、时、分、秒

    

    time类的创建方式有两类3种

    第一种是直接定义time类变量:

    1.直接声明time t;这个时间对象默认值为当前时间

    2.构造函数声明,第一种是对应时间戳格式的构造函数格式为time t = time(timestamp)传入一个秒数,返回一个时间对象;第二种是对

应应用日期格式的构造函数,格式为time t = time(year,month,day,hour,min,s)传入1-6个参数分别表示年月日时分秒,year参数是必须的,其他参数可省略,如果省略则month,day,hour,min,s会分别传入默认值1,1,0,0,0。

    定义了time类变量之后就可以通过 对象名.成员名称 的方式获得成员变量的值了,例如定义time t,那么通过t.year就可以获得t变量所代表时间的年份了。

    然后就是对时间的操作了,我们可以通过成员方法这张表简单了解一下成员方法,第一列是方法名称及参数,第二列是返回值类型,第三列是方法类型,静态方法就是可以通过类名直接调用的方法,例如GetTime()方法可以直接用time.GetTime()进行调用;非静态的方法则必须通过声明一个time变量,通过变量名来调用,ToStr()方法是非静态方法,使用time.ToStr()是不合法的,必须声明一个变量time t,t.ToStr()的方式来调用。当然静态方法也是可以通过变量名来调用的。

    下面我举几个简单的例子来帮助大家了解一下这些方法的使用

    1.一般我们在爬虫采集过程中要获取采集时间时,我们可以写以下的一段脚本来获取当前时间

        record rs;

        var cn = time.GetCn();                    //把当前时间转换为cn时间yyyymmddhhmmss

        rs.getTime = time.CnToStr(cn);        //把cn时间转换为yyyy-mm-dd hh:mm:ss

        /*注:cn时间就是yyyymmddhhmmss格式的时间*/

    除了上面的脚本我们也可以使用下面的脚本来获取当前时间

        record rs;

        time t;                            //声明一个time对象t,默认为当前时间

        rs.getTime = t.ToStr();    //把时间转换为yyyy-mm-dd hh:mm:ss

    两段脚本都是可以实现功能的,在这里我更倾向于使用第二种方法。有时候我们可能只需要年月日yyyy-mm-dd或时分秒hh:mm:ss,也就是时间字符串的一部分,其实这个操作就非常简单了,直接使用字符串操作方法就可以做,大家可以查看字符串类相关方法进行操作。

    2.有时候我们需要采集网页上显示的时间,例如采集贴吧时会有一个发帖时间,在网页上看到的时间都是通过时间戳处理得到的,我们在脚本中如果想进行同样的转换也是有特定的方法的,下面这段脚本就是用来转换时间戳类型的时间的

        record rs;

        var timeStamp = 16089906000155;        //模拟网页上采集的时间戳变量

        var seconds = timeStamp/1000;            //毫秒数转变成秒数

        var t = time(seconds);                           //生成时间对象

        rs.postTime = t.ToStr();    //转换成yyyy-mm-dd hh:mm:ss格式 

/*对于时间戳与应用日期格式的相互转换可以查看这个链接 http://tool.chinaz.com/tools/unixtime.aspx*/

    3.我在配置模板的过程中还遇到了一种情况在这里也和大家分享一下。我们常见有倒计时的网站,例如NBA相关网站中会出现距离某场比赛还有2小时30分这样的情况,但是实际查看网页时发现只有一个表示比赛时间的时间戳,那么这些倒计时又是怎么得到的呢,下面这段脚本将展示如何计算时间差。

        /*实际的倒计时一般是当前时间距离事件发生时间的时间差,那么我们就需要获得当前时间*/

        var timeStamp = 16089906000155;    //模拟网页上采集的时间戳变量

        var airTime = timeStamp/1000;      //事件发生时间的秒数

        var nowTime = time.GetTime;        //当前时间的秒数

        var interval = airTime-nowTime;    //获取时间差秒数

        /*下面就是通过秒数来计算小时数分钟数和秒数hh:mm:ss这样的时间差了,有时候会有天数*/

        //这里假设时间间隔interval = 96030;

        var day = interval/(24*60*60);       //计算天数;     day = 1

        interval = interval%(24*60*60);     //计算剩余时间  interval = 9630

        var hour = interval/(60*60);          //计算小时数    hour = 2  

        interval = interval%(60*60);          //计算剩余时间  interval = 2430

        var min = interval/60;                  //计算分钟数    min = 40

        var sec = interval`;                  //计算秒数      sec = 30

        var str = "倒计时" day "天" hour "小时" min "分钟" sec "秒"; //生成倒计时  str = "倒计时1天2小时40分钟30秒"

    这是我在学习过程中遇到的一些应用,希望能够帮助大家加深对时间类的理解。如果大家有什么疑问可以在下边评论区回复哟。


私信

举报