0
点赞
收藏
分享

微信扫一扫

java.sql.Timestamp 专题

 

java.sql.Timestamp(时间戳)

继承父类:java.util.Date

所有已实现的接口:Serializable, Cloneable, Comparable<Date> 

主要构造方法:Timestamp(long millis) 使用毫秒时间值构造 Timestamp 对象。

Timestamp允许 JDBC API 将该类标识为 SQL TIMESTAMP 值。它通过允许小数秒到纳秒级精度的规范来添加保存 SQLTIMESTAMP 小数秒值的能力。

Timestamp 也提供支持时间戳值的 JDBC 转义语法的格式化和解析操作的能力,主要用于写一些与数据库连接时的日期处理。

例如:

在 ResultSet中我们经常使用的setDate或getDate的数据类型是java.sql.Date,而在平时java程序中我们一般习惯使用 java.util.Date。

但是java.sql.Date 只存储日期数据不存储时间数据 ,这种符合规范的类型其实并没有把时分秒存进数据库,所以存取时就应该用Timestamp的setTimestamp()和

getTimestamp()。

整理一: String --> Timestamp: 

Timestamp转换为String可以直接.toString(),但有时候显示时是不需要小数位后面的毫秒值,需要借助DateFormat在转换为String时重新定义格式。

使用Timestamp的valueOf()方法, 

Timestamp time= new Timestamp(System.currentTimeMillis());//获取系统当前时间   
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String timeStr = df.format(time);
time = Timestamp.valueOf(timeStr);
System.out.println(time);//2017-05-06 15:54:21.0

整理二: java.util.Date --> Timestamp

方式1: 使用Timestamp的构造方法

Date date = new Date();  
Timestamp ts = new Timestamp(date.getTime());

方式2:

注意:父类不能直接向子类转化,需要借助中间的String,并且format的格式要与Timestamp的字符串类型格式相匹配

java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]

Date date = new Date();    
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = sdf.format(date);
Timestamp ts = Timestamp.valueOf(dateStr); //2017-05-06 15:54:21.0

整理三:

通过构造方法创建Timestamp 对象,获取毫秒值有下面三种方法:

方法1:

System.currentTimeMillis(); 

方法2:

Calendar.getInstance().getTimeInMillis(); 

方法3: 

new Date().getTime();

测试证明:System.currentTimeMillis() 这种方式速度最快

Calendar.getInstance().getTimeInMillis() 这种方式速度最慢,因为Canlendar因为要处理时区问题会耗费很多的时间。

所以建议多使用第一种方式。

方法摘要 

boolean after(Timestamp ts) 

        指示此 Timestamp 对象是否晚于给定的 Timestamp 对象。 

boolean before(Timestamp ts) 

        指示此 Timestamp 对象是否早于给定的 Timestamp 对象。 

int compareTo(Date o) 

        将此 Timestamp 对象与给定的 Date(必须为 Timestamp 对象)相比较。 

int compareTo(Timestamp ts) 

        将此 Timestamp 对象与给定 Timestamp 对象相比较。 

boolean equals(Object ts) 

        测试此对象是否等于给定的 Timestamp 对象。 

boolean equals(Timestamp ts) 

        测试此 Timestamp 对象是否等于给定的 Timestamp 对象。 

int getNanos() 

        获取此 Timestamp 对象的 nanos 值。 

long getTime() 

        返回此 Timestamp 对象表示的自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数。 

void setNanos(int n) 

        将此 Timestamp 对象的 nanos 字段设置为给定值。 

void setTime(long time) 

        设置此 Timestamp 对象,以表示 1970 年 1 月 1 日 00:00:00 GMT 以后 time 毫秒的时间点。 

String toString() 

        使用 JDBC 时间戳转义格式编排时间戳。 

static Timestamp valueOf(String s) 

        将使用 JDBC 时间戳转义格式的 String 对象转换为 Timestamp 值。 

实例代码:

tLotteryAnnouncement.setDateTime(new Timestamp(System.currentTimeMillis()));  
if(StringUtils.isNotBlank(tIsusesKj.getOpenTime())){
tLotteryAnnouncement.setOpenTime(Timestamp.valueOf(tIsusesKj.getOpenTime()));
}else{
tLotteryAnnouncement.setOpenTime(new Timestamp(tIsusesKj.getModifyDate().getTime()));
}

 


Java里得到00:00:00格式的时分秒的Timestamp

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.TimeZone;

public class Test {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long t = System.currentTimeMillis();
t = t / (1000 * 3600 * 24) * (1000 * 3600 * 24);
System.out.println(sdf.format(new Timestamp(t)));
t = System.currentTimeMillis();
t = t / (1000 * 3600 * 24) * (1000 * 3600 * 24) - TimeZone.getDefault().getRawOffset();
System.out.println(sdf.format(new Timestamp(t)));
}
}

 

2022-08-06 08:00:00
2022-08-06 00:00:00

 

 

1 Java.util.Date包含年、月、日、时、分、秒信息。

代码如下:

// String转换为Date
String dateStr="2013-8-13 23:23:23";
String pattern="yyyy-MM-dd HH:mm:ss";
DateFormate dateFormat=new SimpleDateFormat(pattern);
Date date=dateFormat.parse(dateStr);
date=dateFormat.format(date);

2 Java.sql.Date包含年、月、日信息。
继承自java.util.Date。在数据库相关操作中使用,如rs.getDate,ps.setDate等。rs是指ResultSet,ps是指PreparedStatement。

代码如下:

// java.util.Date转换为java.sql.Date
new java.sql.Date(utilDate.getTime());// 其中utilDate为java.util.Date类型的对象

3 Java.util.Calendar包含年、月、日、时、分、秒、毫秒信息。
JDK1.1引入,用以代替java.util.Date。

代码如下:

// Date转为Calendar
Date date=new Date();
Calendar calendar=Calendar.getInstance();
calendar.setTime(date);

 

// Calendar转为Date
Calendar ca=Calendar.getInstance(); &nbsp;
Date d =(Date) ca.getTime();

4 Java.sql.Timestamp包含年、月、日、时、分、秒、纳秒(nano)信息。
继承自java.util.Date。比java.sql.Date包含更多信息。在数据库相关操作中使用,如rs.getTimestamp,ps.setTimeStamp等。
例如:若数据库中某字段hireDate为Oracle的Date类型,则使用getTimestamp时能够将年、月、日、时、分、秒信息取出;
但使用getDate时则只能取出年、月、日信息。因此,一般推荐使用getTimestamp。

代码如下:

// java.util.Calendar转换为java.sql.Timestamp
new Timestamp(Calendar.getInstance().getTimeInMillis());
// java.util.Date转换为java.sql.Timestamp
new Timestamp(date.getTime());
// String转换为java.sql.Timestamp,String格式:yyyy-mm-dd hh:mm:ss[.f...] ,方括号表示可选
Timestamp.valueOf("2013-07-06 01:49:30");


5 Oracle数据库提供的日期和时间类型Oracle数据库提供了DATE,TIMESTAMP,TIMESTAMP WITH TIME ZONE和TIMESTAMP WITH LOCAL TIME ZONE四种类型。

 

DATE包含世纪、年、月、日、时、分、秒信息。
TIMESTAMP是DATE的扩展,包含年、月、日、时、分、秒和fractional seconds信息。定义TIMESTAMP的格式如下:

代码如下:

TIMESTAMP [(fractional_seconds_precision)]
// 格式
TIMESTAMP 'YYYY-MM-DD HH24:MI:SS.FF'
// 一个例子
TIMESTAMP '1997-01-31 09:26:50.12'


其中fractional_seconds_precision是可选的,用于指定秒使用含几位小数的浮点数表示,它的取值范围是0到9,默认是6。上述例子中表示采用两位小数,它的秒值是50.12。注意:12不是毫秒值,也不是微秒值。

 

 

 

Java8 LocalDateTime与timestamp转换

将timestamp转为LocalDateTime

​​public​​​ ​​LocalDateTime timestamToDatetime(​​​​long​​​ ​​timestamp){​​
​​Instant instant = Instant.ofEpochMilli(timestamp);​​
​​return​​​ ​​LocalDateTime.ofInstant(instant, ZoneId.systemDefault());​​
​​}​​

将LocalDataTime转为timestamp

​​public​​​ ​​long​​​ ​​datatimeToTimestamp(LocalDateTime ldt){​​
​​long​​​ ​​timestamp = ldt.toInstant(ZoneOffset.of(​​​​"+8"​​​​)).toEpochMilli();​​
​​return​​​ ​​timestamp;​​
​​}​​

我在网上还找到了另一个将datetime转为时间戳的方法:

​​ZoneId zone = ZoneId.systemDefault();​​
​​long​​​ ​​timestamp = ldt.atZone(zone).toInstant().toEpochMilli();​​

Java8的时间转为时间戳的大概的思路就是LocalDateTime先转为Instant,设置时区,然后转timestamp。

附一个Java8中的LocalDateTime工具类

工具类

​​import​​​ ​​java.time.*;​​
​​import​​​ ​​java.time.format.DateTimeFormatter;​​
​​import​​​ ​​java.time.temporal.ChronoUnit;​​
​​import​​​ ​​java.time.temporal.TemporalUnit;​​
​​import​​​ ​​java.util.Date;​​

​​/*​​
​​* @author kingboy​​
​​* @Date 2017/7/22 下午2:12​​
​​* @Description LocalDateTimeUtils is used to Java8中的时间类​​
​​*/​​
​​public​​​ ​​class​​​ ​​LocalDateTimeUtils {​​

​​//获取当前时间的LocalDateTime对象​​
​​//LocalDateTime.now();​​

​​//根据年月日构建LocalDateTime​​
​​//LocalDateTime.of();​​

​​//比较日期先后​​
​​//LocalDateTime.now().isBefore(),​​
​​//LocalDateTime.now().isAfter(),​​

​​//Date转换为LocalDateTime​​
​​public​​​ ​​static​​​ ​​LocalDateTime convertDateToLDT(Date date) {​​
​​return​​​ ​​LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());​​
​​}​​

​​//LocalDateTime转换为Date​​
​​public​​​ ​​static​​​ ​​Date convertLDTToDate(LocalDateTime time) {​​
​​return​​​ ​​Date.from(time.atZone(ZoneId.systemDefault()).toInstant());​​
​​}​​


​​//获取指定日期的毫秒​​
​​public​​​ ​​static​​​ ​​Long getMilliByTime(LocalDateTime time) {​​
​​return​​​ ​​time.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();​​
​​}​​

​​//获取指定日期的秒​​
​​public​​​ ​​static​​​ ​​Long getSecondsByTime(LocalDateTime time) {​​
​​return​​​ ​​time.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();​​
​​}​​

​​//获取指定时间的指定格式​​
​​public​​​ ​​static​​​ ​​String formatTime(LocalDateTime time,String pattern) {​​
​​return​​​ ​​time.format(DateTimeFormatter.ofPattern(pattern));​​
​​}​​

​​//获取当前时间的指定格式​​
​​public​​​ ​​static​​​ ​​String formatNow(String pattern) {​​
​​return​​​ ​​formatTime(LocalDateTime.now(), pattern);​​
​​}​​

​​//日期加上一个数,根据field不同加不同值,field为ChronoUnit.*​​
​​public​​​ ​​static​​​ ​​LocalDateTime plus(LocalDateTime time, ​​​​long​​​ ​​number, TemporalUnit field) {​​
​​return​​​ ​​time.plus(number, field);​​
​​}​​

​​//日期减去一个数,根据field不同减不同值,field参数为ChronoUnit.*​​
​​public​​​ ​​static​​​ ​​LocalDateTime minu(LocalDateTime time, ​​​​long​​​ ​​number, TemporalUnit field){​​
​​return​​​ ​​time.minus(number,field);​​
​​}​​

​​/**​​
​​* 获取两个日期的差 field参数为ChronoUnit.*​​
​​* @param startTime​​
​​* @param endTime​​
​​* @param field 单位(年月日时分秒)​​
​​* @return​​
​​*/​​
​​public​​​ ​​static​​​ ​​long​​​ ​​betweenTwoTime(LocalDateTime startTime, LocalDateTime endTime, ChronoUnit field) {​​
​​Period period = Period.between(LocalDate.from(startTime), LocalDate.from(endTime));​​
​​if​​​ ​​(field == ChronoUnit.YEARS) ​​​​return​​​ ​​period.getYears();​​
​​if​​​ ​​(field == ChronoUnit.MONTHS) ​​​​return​​​ ​​period.getYears() * ​​​​12​​​ ​​+ period.getMonths();​​
​​return​​​ ​​field.between(startTime, endTime);​​
​​}​​

​​//获取一天的开始时间,2017,7,22 00:00​​
​​public​​​ ​​static​​​ ​​LocalDateTime getDayStart(LocalDateTime time) {​​
​​return​​​ ​​time.withHour(​​​​0​​​​)​​
​​.withMinute(​​​​0​​​​)​​
​​.withSecond(​​​​0​​​​)​​
​​.withNano(​​​​0​​​​);​​
​​}​​

​​//获取一天的结束时间,2017,7,22 23:59:59.999999999​​
​​public​​​ ​​static​​​ ​​LocalDateTime getDayEnd(LocalDateTime time) {​​
​​return​​​ ​​time.withHour(​​​​23​​​​)​​
​​.withMinute(​​​​59​​​​)​​
​​.withSecond(​​​​59​​​​)​​
​​.withNano(​​​​999999999​​​​);​​
​​}​​

​​}​​

测试类

​​import​​​ ​​com.kingboy.common.utils.date.LocalDateTimeUtils;​​
​​import​​​ ​​org.junit.Test;​​
​​import​​​ ​​java.time.LocalDateTime;​​
​​import​​​ ​​java.time.temporal.ChronoUnit;​​

​​import​​​ ​​static​​​ ​​com.kingboy.common.utils.date.LocalDateTimeUtils.getDayEnd;​​
​​import​​​ ​​static​​​ ​​com.kingboy.common.utils.date.LocalDateTimeUtils.getDayStart;​​

​​/**​​
​​* @author kingboy​​
​​* @Date 2017/7/22 下午7:16​​
​​* @Description LocaDateTimeUtilsTest is used to 测试LocalDateTime工具​​
​​*/​​
​​public​​​ ​​class​​​ ​​LocaDateTimeUtilsTest {​​

​​@Test​​
​​public​​​ ​​void​​​ ​​format_test() {​​
​​System.out.println(LocalDateTimeUtils.formatNow(​​​​"yyyy年MM月dd日 HH:mm:ss"​​​​));​​
​​}​​

​​@Test​​
​​public​​​ ​​void​​​ ​​betweenTwoTime_test() {​​
​​LocalDateTime start = LocalDateTime.of(​​​​1993​​​​, ​​​​10​​​​, ​​​​13​​​​, ​​​​11​​​​, ​​​​11​​​​);​​
​​LocalDateTime end = LocalDateTime.of(​​​​1994​​​​, ​​​​11​​​​, ​​​​13​​​​, ​​​​13​​​​, ​​​​13​​​​);​​
​​System.out.println(​​​​"年:"​​​ ​​+ LocalDateTimeUtils.betweenTwoTime(start, end, ChronoUnit.YEARS));​​
​​System.out.println(​​​​"月:"​​​ ​​+ LocalDateTimeUtils.betweenTwoTime(start, end, ChronoUnit.MONTHS));​​
​​System.out.println(​​​​"日:"​​​ ​​+ LocalDateTimeUtils.betweenTwoTime(start, end, ChronoUnit.DAYS));​​
​​System.out.println(​​​​"半日:"​​​ ​​+ LocalDateTimeUtils.betweenTwoTime(start, end, ChronoUnit.HALF_DAYS));​​
​​System.out.println(​​​​"小时:"​​​ ​​+ LocalDateTimeUtils.betweenTwoTime(start, end, ChronoUnit.HOURS));​​
​​System.out.println(​​​​"分钟:"​​​ ​​+ LocalDateTimeUtils.betweenTwoTime(start, end, ChronoUnit.MINUTES));​​
​​System.out.println(​​​​"秒:"​​​ ​​+ LocalDateTimeUtils.betweenTwoTime(start, end, ChronoUnit.SECONDS));​​
​​System.out.println(​​​​"毫秒:"​​​ ​​+ LocalDateTimeUtils.betweenTwoTime(start, end, ChronoUnit.MILLIS));​​
​​//=============================================================================================​​
​​/*​​
​​年:1​​
​​月:13​​
​​日:396​​
​​半日:792​​
​​小时:9506​​
​​分钟:570362​​
​​秒:34221720​​
​​毫秒:34221720000​​
​​*/​​
​​}​​

​​@Test​​
​​public​​​ ​​void​​​ ​​plus_test() {​​
​​//增加二十分钟​​
​​System.out.println(LocalDateTimeUtils.formatTime(LocalDateTimeUtils.plus(LocalDateTime.now(),​​
​​20​​​​,​​
​​ChronoUnit.MINUTES), ​​​​"yyyy年MM月dd日 HH:mm"​​​​));​​
​​//增加两年​​
​​System.out.println(LocalDateTimeUtils.formatTime(LocalDateTimeUtils.plus(LocalDateTime.now(),​​
​​2​​​​,​​
​​ChronoUnit.YEARS), ​​​​"yyyy年MM月dd日 HH:mm"​​​​));​​
​​//=============================================================================================​​
​​/*​​
​​2017年07月22日 22:53​​
​​2019年07月22日 22:33​​
​​*/​​
​​}​​

​​@Test​​
​​public​​​ ​​void​​​ ​​dayStart_test() {​​
​​System.out.println(getDayStart(LocalDateTime.now()));​​
​​System.out.println(getDayEnd(LocalDateTime.now()));​​
​​//=============================================================================================​​
​​/*​​
​​2017-07-22T00:00​​
​​2017-07-22T23:59:59.999999999​​
​​*/​​
​​}​​

​​}​​

 

 

一、String与Date(java.util.Date)互转

     1.1 String -> Date

​​String dateStr = ​​​​"// ::"​​​​;  ​​
​​Date date = ​​​​new​​​ ​​Date(); ​​
​​//注意format的格式要与日期String的格式相匹配 ​​
​​DateFormat sdf = ​​​​new​​​ ​​SimpleDateFormat(​​​​"yyyy/MM/dd HH:mm:ss"​​​​); ​​
​​try​​​ ​​{ ​​
​​date = sdf.parse(dateStr); ​​
​​System.out.println(date.toString()); ​​
​​} ​​​​catch​​​ ​​(Exception e) { ​​
​​e.printStackTrace(); ​​
​​} ​​
​​String dateStr = ​​​​"2010/05/04 12:34:23"​​​​;​​
​​Date date = ​​​​new​​​ ​​Date();​​
​​//注意format的格式要与日期String的格式相匹配​​
​​DateFormat sdf = ​​​​new​​​ ​​SimpleDateFormat(​​​​"yyyy/MM/dd HH:mm:ss"​​​​);​​
​​try​​​ ​​{​​
​​date = sdf.parse(dateStr);​​
​​System.out.println(date.toString());​​
​​} ​​​​catch​​​ ​​(Exception e) {​​
​​e.printStackTrace();​​
​​}​​

  1.2 Date -> String

   日期向字符串转换,可以设置任意的转换格式format

​​String dateStr = ​​​​""​​​​;  ​​
​​Date date = ​​​​new​​​ ​​Date(); ​​
​​//format的格式可以任意 ​​
​​DateFormat sdf = ​​​​new​​​ ​​SimpleDateFormat(​​​​"yyyy/MM/dd HH:mm:ss"​​​​); ​​
​​DateFormat sdf = ​​​​new​​​ ​​SimpleDateFormat(​​​​"yyyy-MM-dd HH/mm/ss"​​​​); ​​
​​try​​​ ​​{ ​​
​​dateStr = sdf.format(date); ​​
​​System.out.println(dateStr); ​​
​​dateStr = sdf.format(date); ​​
​​System.out.println(dateStr); ​​
​​} ​​​​catch​​​ ​​(Exception e) { ​​
​​e.printStackTrace(); ​​
​​} ​​
​​String dateStr = ​​​​""​​​​;​​
​​Date date = ​​​​new​​​ ​​Date();​​
​​//format的格式可以任意​​
​​DateFormat sdf = ​​​​new​​​ ​​SimpleDateFormat(​​​​"yyyy/MM/dd HH:mm:ss"​​​​);​​
​​DateFormat sdf2 = ​​​​new​​​ ​​SimpleDateFormat(​​​​"yyyy-MM-dd HH/mm/ss"​​​​);​​
​​try​​​ ​​{​​
​​dateStr = sdf.format(date);​​
​​System.out.println(dateStr);​​
​​dateStr = sdf2.format(date);​​
​​System.out.println(dateStr);​​
​​} ​​​​catch​​​ ​​(Exception e) {​​
​​e.printStackTrace();​​
​​}​​

 二、String与Timestamp互转

  2.1 String ->Timestamp

   使用Timestamp的valueOf()方法

​​Timestamp ts = ​​​​new​​​ ​​Timestamp(System.currentTimeMillis());  ​​
​​String tsStr = ​​​​"-- ::"​​​​; ​​
​​try​​​ ​​{ ​​
​​ts = Timestamp.valueOf(tsStr); ​​
​​System.out.println(ts); ​​
​​} ​​​​catch​​​ ​​(Exception e) { ​​
​​e.printStackTrace(); ​​
​​} ​​
​​Timestamp ts = ​​​​new​​​ ​​Timestamp(System.currentTimeMillis());​​
​​String tsStr = ​​​​"2011-05-09 11:49:45"​​​​;​​
​​try​​​ ​​{​​
​​ts = Timestamp.valueOf(tsStr);​​
​​System.out.println(ts);​​
​​} ​​​​catch​​​ ​​(Exception e) {​​
​​e.printStackTrace();​​
​​}​​

   注:String的类型必须形如: yyyy-mm-dd hh:mm:ss[.f...] 这样的格式,中括号表示可选,否则报错!!!

    如果String为其他格式,可考虑重新解析下字符串,再重组~~

    2.2 Timestamp -> String

  使用Timestamp的toString()方法或者借用DateFormat

 

​​Timestamp ts = ​​​​new​​​ ​​Timestamp(System.currentTimeMillis());  ​​
​​String tsStr = ​​​​""​​​​; ​​
​​DateFormat sdf = ​​​​new​​​ ​​SimpleDateFormat(​​​​"yyyy/MM/dd HH:mm:ss"​​​​); ​​
​​try​​​ ​​{ ​​
​​//方法一 ​​
​​tsStr = sdf.format(ts); ​​
​​System.out.println(tsStr); ​​
​​//方法二 ​​
​​tsStr = ts.toString(); ​​
​​System.out.println(tsStr); ​​
​​} ​​​​catch​​​ ​​(Exception e) { ​​
​​e.printStackTrace(); ​​
​​} ​​
​​Timestamp ts = ​​​​new​​​ ​​Timestamp(System.currentTimeMillis());​​
​​String tsStr = ​​​​""​​​​;​​
​​DateFormat sdf = ​​​​new​​​ ​​SimpleDateFormat(​​​​"yyyy/MM/dd HH:mm:ss"​​​​);​​
​​try​​​ ​​{​​
​​//方法一​​
​​tsStr = sdf.format(ts);​​
​​System.out.println(tsStr);​​
​​//方法二​​
​​tsStr = ts.toString();​​
​​System.out.println(tsStr);​​
​​} ​​​​catch​​​ ​​(Exception e) {​​
​​e.printStackTrace();​​
​​}​​

 很容易能够看出来,方法一的优势在于可以灵活的设置字符串的形式。

三、Date( java.util.Date )和Timestamp互转

  声明:查API可知,Date和Timesta是父子类关系

  3.1 Timestamp -> Date

​​Timestamp ts = ​​​​new​​​ ​​Timestamp(System.currentTimeMillis());  ​​
​​Date date = ​​​​new​​​ ​​Date(); ​​
​​try​​​ ​​{ ​​
​​date = ts; ​​
​​System.out.println(date); ​​
​​} ​​​​catch​​​ ​​(Exception e) { ​​
​​e.printStackTrace(); ​​
​​} ​​
​​Timestamp ts = ​​​​new​​​ ​​Timestamp(System.currentTimeMillis());​​
​​Date date = ​​​​new​​​ ​​Date();​​
​​try​​​ ​​{​​
​​date = ts;​​
​​System.out.println(date);​​
​​} ​​​​catch​​​ ​​(Exception e) {​​
​​e.printStackTrace();​​
​​}​​

 很简单,但是此刻date对象指向的实体却是一个Timestamp,即date拥有Date类的方法,但被覆盖的方法的执行实体在Timestamp中。

   3.2 Date -> Timestamp

   父类不能直接向子类转化,可借助中间的String~~~~

​​java.sql.Date 只存储日期数据不存储时间数据​​
​​// 会丢失时间数据​​
​​preparedStatement.setDate(​​​​1​​​​, ​​​​new​​​ ​​java.sql.Date(date.getTime()));​​
​​//可以这样来处理​​
​​preparedStatement.setTimestamp(​​​​1​​​​, ​​​​new​​​ ​​java.sql.Timestamp(​​​​new​​​ ​​java.util.Date().getTime()));​​
​​//想要得到完整的数据,包括日期和时间,可以这样​​
​​java.util.Date d = resultSet.getTimestamp(​​​​1​​​​);​​
​​//这样处理更合适一些,可以避免一些潜在Timestamp 问题​​
​​java.util.Date d = ​​​​new​​​ ​​java.util.Date(resultSet.getTimestamp(​​​​1​​​​).getTime());​​

自己补的话,这样的话:

        往数据库存储的时候可以接收 java.util.Date类型 再用getTime()方法得到代表那个Date对象的long值,再以这个long值 构造一个Timestamp对象 存进数据库中。

       从存数据库里取的时候,可以先得到Timestamp用他的getTime()方法得到long值,再以这个long值构造一个java.util.Date对象,这样就可以对这个Date对象操作了。不如说 new SimpleTimeFormat("yyyyy-MM-dd HH:mm:ss").format()等等

 

java.sql.Timestamp(时间戳)

继承父类:java.util.Date

所有已实现的接口:Serializable, Cloneable, Comparable<Date> 

主要构造方法:Timestamp(long millis) 使用毫秒时间值构造 Timestamp 对象。

Timestamp允许 JDBC API 将该类标识为 SQL TIMESTAMP 值。它通过允许小数秒到纳秒级精度的规范来添加保存 SQLTIMESTAMP 小数秒值的能力。

Timestamp 也提供支持时间戳值的 JDBC 转义语法的格式化和解析操作的能力,主要用于写一些与数据库连接时的日期处理。

例如:

在 ResultSet中我们经常使用的setDate或getDate的数据类型是java.sql.Date,而在平时java程序中我们一般习惯使用 java.util.Date。

但是java.sql.Date 只存储日期数据不存储时间数据 ,这种符合规范的类型其实并没有把时分秒存进数据库,所以存取时就应该用Timestamp的setTimestamp()和

getTimestamp()。

整理一: String --> Timestamp: 

Timestamp转换为String可以直接.toString(),但有时候显示时是不需要小数位后面的毫秒值,需要借助DateFormat在转换为String时重新定义格式。

使用Timestamp的valueOf()方法, 

​​Timestamp time= ​​​​new​​​ ​​Timestamp(System.currentTimeMillis());​​​​//获取系统当前时间   ​​
​​SimpleDateFormat df = ​​​​new​​​ ​​SimpleDateFormat(​​​​"yyyy-MM-dd HH:mm:ss"​​​​); ​​
​​String timeStr = df.format(time); ​​
​​time = Timestamp.valueOf(timeStr); ​​
​​System.out.println(time);​​​​//2017-05-06 15:54:21.0​​

整理二: java.util.Date --> Timestamp

方式1: 使用Timestamp的构造方法

​​Date date = ​​​​new​​​ ​​Date();  ​​
​​Timestamp ts = ​​​​new​​​ ​​Timestamp(date.getTime());​​

方式2:

注意:父类不能直接向子类转化,需要借助中间的String,并且format的格式要与Timestamp的字符串类型格式相匹配

java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]

​​Date date = ​​​​new​​​ ​​Date();    ​​
​​DateFormat sdf = ​​​​new​​​ ​​SimpleDateFormat(​​​​"yyyy-MM-dd HH:mm:ss"​​​​); ​​
​​String dateStr = sdf.format(date); ​​
​​Timestamp ts = Timestamp.valueOf(dateStr); ​​​​//2017-05-06 15:54:21.0​​

整理三:

通过构造方法创建Timestamp 对象,获取毫秒值有下面三种方法:

方法1:

System.currentTimeMillis(); 

方法2:

Calendar.getInstance().getTimeInMillis(); 

方法3: 

new Date().getTime();

测试证明:System.currentTimeMillis() 这种方式速度最快

Calendar.getInstance().getTimeInMillis() 这种方式速度最慢,因为Canlendar因为要处理时区问题会耗费很多的时间。

所以建议多使用第一种方式。

方法摘要 

boolean after(Timestamp ts) 

        指示此 Timestamp 对象是否晚于给定的 Timestamp 对象。 

boolean before(Timestamp ts) 

指示此 Timestamp 对象是否早于给定的 Timestamp 对象。 

int compareTo(Date o) 

将此 Timestamp 对象与给定的 Date(必须为 Timestamp 对象)相比较。 

int compareTo(Timestamp ts) 

将此 Timestamp 对象与给定 Timestamp 对象相比较。 

boolean equals(Object ts) 

测试此对象是否等于给定的 Timestamp 对象。 

boolean equals(Timestamp ts) 

测试此 Timestamp 对象是否等于给定的 Timestamp 对象。 

int getNanos() 

获取此 Timestamp 对象的 nanos 值。 

long getTime() 

返回此 Timestamp 对象表示的自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数。 

void setNanos(int n) 

将此 Timestamp 对象的 nanos 字段设置为给定值。 

void setTime(long time) 

设置此 Timestamp 对象,以表示 1970 年 1 月 1 日 00:00:00 GMT 以后 time 毫秒的时间点。 

String toString() 

使用 JDBC 时间戳转义格式编排时间戳。 

static Timestamp valueOf(String s) 

将使用 JDBC 时间戳转义格式的 String 对象转换为 Timestamp 值。 

实例代码:

​​tLotteryAnnouncement.setDateTime(​​​​new​​​ ​​Timestamp(System.currentTimeMillis()));  ​​
​​if​​​​(StringUtils.isNotBlank(tIsusesKj.getOpenTime())){ ​​
​​tLotteryAnnouncement.setOpenTime(Timestamp.valueOf(tIsusesKj.getOpenTime())); ​​
​​}​​​​else​​​​{ ​​
​​tLotteryAnnouncement.setOpenTime(​​​​new​​​ ​​Timestamp(tIsusesKj.getModifyDate().getTime())); ​​
​​}​​










 

 

 



举报

相关推荐

0 条评论