Java - TimeStamp
2017-3-11
最近要用到时间戳,刚好Java自带的package中有tiemstamp的类。看看能不能满足我的需求。
首先描述一下我的需求吧。我现在要做一个周期性查询交换机流表项的功能,需要在每次查询流表项时记录当时的时间戳。然后我要根据时间戳输出info,并且在计算速率什么的时候也要用到时间戳。因此,必须能够提供下面的功能:
- 时间戳要便于遍历和查询
- 时间戳需要能够数值化
- 时间戳与时间戳之间需要能够进行简单的加减运算,并能输出数值化的结果
好,需求如上。我们现在来看看Java(Java SE8)官方文档中的TimeStamp。首先我们来看看它的依赖关系:
Class Timestamp
java.lang.Object
java.security.Timestamp
All Implemented Interfaces:
Serializable
public final class Timestamp
extends Object
implements Serializable
上面是官方的说明,我们可以看到:TimeStamp实现了Serializable接口,这个Serializable接口是什么呢?实现这个接口可以让这个类可序列化,所谓的可序列化就是java提供的通用数据保存和读取的接口。至于从什么地方读出来和保存到哪里去都被隐藏在函数参数的背后了。详细的内容可以参考我的另一篇博文java - 序列化和反序列化。
然后我们来看看TimeStamp的构造函数和公共方法:
函数名 | 原型 | 描述 |
---|---|---|
Timestamp | Timestamp(Date timestamp, CertPath signerCertPath) | 构造函数 |
equals | boolean equals(Object obj) | Tests for equality between the specified object and this timestamp. |
getSignerCertPath | CertPath getSignerCertPath() | Returns the certificate path for the Timestamping Authority. |
getTimestamp | Date getTimestamp() | Returns the date and time when the timestamp was generated. |
hashCode | int hashCode() | Returns the hash code value for this timestamp. |
toString | String toString() | Returns a string describing this timestamp. |
还有一些继承自java.lang.Object的方法:clone, finalize, getClass, notify, notifyAll, wait, wait, wait。
我们重点看TimeStamp自身的方法:
先是构造函数,从上表中我们可以看出,在初始化一个TimeStamp对象时,我们需要一个Data对象和CertPath对象。这两个对象又是什么鬼呢?
我这里对它们做一个简单的介绍。Data类的构造方法有多个:
原型 | 描述 |
---|---|
Date() | 分配一个Data对象并初始化它的时间为最近的时间(毫秒级) |
Date(int year, int month, int date) | 看看就知道,不细说了 |
Date(int year, int month, int date, int hrs, int min) | 看看就知道,不细说了 |
Date(int year, int month, int date, int hrs, int min, int sec) | 看看就知道,不细说了 |
Date(long date) | 分配一个Data对象并初始化它的时间为指定的数值(毫秒为单位),起始时间是January 1, 1970, 00:00:00 GMT |
Date(String s) | 没有细说,不过我并不关心这个构造函数,感觉用到的场合并不多(应该说我想不到什么场合必须用这个构造函数) |
好了,这样我们就能创建一个Data对象,并给它赋值了。因为我需要用TimeStamp来进行计算,所以使用Date(long date)构建函数会比较方便。然后我们来看看CertPath对象,CertPath是“An immutable sequence of certificates (a certification path).”…嗯?这是什么鬼,为什么一个时间戳和证书会扯上关系?
…百度了一些资料,感觉信息量有点多,所以先回避了。我在Java官方库中又找到了一个TimeStamp(java.sql.Timestamp)。而上面的是java.security.Timestamp(和安全有关,这里暂时不解释,之后有时间更新)
好的,我们现在来看看java.sql.Timestamp是怎么样的吧。首先我们来看看它的依赖关系:
Class Timestamp
java.lang.Object
java.util.Date
java.sql.Timestamp
All Implemented Interfaces:
Serializable, Cloneable, Comparable<Date>
public class Timestamp
extends Date
我们可以看到java.sql.Timestamp继承了Data类。我们再来看看它的构造函数和方法:
函数名 | 原型 | 描述 |
---|---|---|
Timestamp | Timestamp(int year, int month, int date, int hour, int minute, int second, int nano) | 不解释 |
Timestamp | Timestamp(long time) | 这里输入的是毫秒级的时间戳,起始时间是January 1, 1970, 00:00:00 GMT,负数表示起始时间之前 |
after | boolean after(Timestamp ts) | 判断是否在ts之后(时间上) |
before | boolean before(Timestamp ts) | 判断是否在ts之前(时间上) |
compareTo | int compareTo(Date o) | 与Data对象作比较 |
compareTo | int compareTo(Timestamp ts) | 与Timestamp对象作比较 |
equals | boolean equals(Object ts) | |
equals | boolean equals(Timestamp ts) | |
from | static Timestamp from(Instant instant) | 从一个TimeStamp对象中获取它的实例 |
getNanos | int getNanos() | 获取TimeStamp的纳秒数值 |
getTime | long getTime() | 获取TimeStamp的毫秒数值 |
hashCode | int hashCode() | 返回该对象的哈希码 |
setNanos | void setNanos(int n) | 设置TimeStamp的纳秒数值 |
setTime | void setTime(long time) | 设置TimeStamp的毫秒数值 |
toInstant | Instant toInstant() | 将Timestamp对象转换成一个实例 |
toLocalDateTime | LocalDateTime toLocalDateTime() | 将TimeStamp转换成LocalDateTime |
toString | String toString() | 将TimeStamp转换成timestamp escape格式 |
valueOf | static Timestamp valueOf(LocalDateTime dateTime) | 从一个LocalDateTime对象中获取Timestamp实例 |
valueOf | static Timestamp valueOf(String s) | 将一个timestamp escape格式的字符串转换成Timestamp |
然后还有继承自java.util.Date的方法:after, efore, clone, getDate, getDay, getHours, getMinutes, getMonth, getSeconds, getTimezoneOffset, getYear, parse, setDate, setHours, setMinutes, setMonth, setSeconds, setYear, toGMTString, toLocaleString,UTC;继承自Object的方法:finalize, getClass, notify, notifyAll, wait, wait, wait
从上面的API中我们可以看出,TimeStamp是能够被数值化并进行数值计算的。同时由于它是一个对象,所以不能简单地被遍历,查询或排序;但是还是可以满足我的需求的。