额,其实做项目一个无可避免的工具包就是时间日期格式的转换。因为时间久了所以自己也存了好多关于转换的方法之类的。但是有时候就会不满足需求,手写一时半会儿还写不出来(我不知道是不是我太菜了,知道某类大概有什么什么方法,但是让我纯靠记忆手敲却敲不出来,只能靠万能的百度啦~~)
所以在今天需要找util.date转换成sql.date的时候,觉得还是专门写一个目前我所用到的整理的时间上的转换方法吧。
首先说一下java中常用的时间类:
java.util.Date 年月日时分秒的日期格式(看起来挺不方便的)。Fri Jun 28 12:49:14 CST 2019 一般我们获取当前系统时间直接new就可以。有无参构造。
java.sql.Date 年月日的日期格式。从包名就能看出来是sql语句中使用的。其实这个类的出现挺人性化的 。再也不用担心数据库中关于时间转换的各种坑了~~~不过这个类没有无参构造。所以在创建的时候要么传一个毫秒数(常用),要么传三个int值,分别是年,月,日的参数。需要注意的是1:这个方法现在已经不推荐使用了。2,这个月的参数从0开始的。0代表1月,1代表2月以此类推。
java.sql.Time 时分秒的日期格式。同样在sql语句中使用的。也没有无参构造。创建方法也是两种要么传毫秒数要么传三个int值代表时分秒。同样这个传时分秒的方法也不推荐使用了。然后比如传分钟超过60了,则小时自动加一。单从用法上面还是有点人性化的。
java.sql.Timestamp 年月日时分秒毫秒的格式(我个人最喜欢这种了~~),sql包下时间的传统,没有无参构造。创建方法1,传入毫秒数。2,传七个int分别对应每一个时间日期的值。需要注意的1,这个方法不推荐使用了。2,这个年是从1900年往后加的。比如你传1,则是1901年。你传100就是2000年,以此类推。
java.util.Calendar和java.text.SimpleDateFormat是两个时间上的工具类(个人理解,勿撕)。其中Calendar中文是日历类,是一个抽象类,主要就是用于日期之间的计算的。SimpleDateFormat是一个转换时间日期格式的。在这就不太重点讲解了,毕竟常用的就那么几个方法,在下面的转换方法中涉及到我会带注解。
对了,还要说明一点:util.Date是其余sql.Date,sql.Time,sql.Timestamp的父类。差不多基本知识也就这样了。接下来是每种日期的获取:(ps:因为名字一样所以导包的时候要注意,不然跟我一样写全限定名也ok)
获取当前系统时间:
util.Date:
java.util.Date date = new java.util.Date();
sql.Date:因为要当前系统时间所以参数要输入当前毫秒数,我直接用util.Date获取了。用系统时间戳也ok的,喜欢哪种抱走哪种。它打印出来只有日期而没有时间。
java.sql.Date date = new java.sql.Date(new java.util.Date().getTime());
java.sql.Date date = new java.sql.Date(System.currentTimeMillis());
sql.Time:和sql.Date是差不多了,区别是它只有时间没有日期。
Time time = new Time(new java.util.Date().getTime());
Time time = new Time(System.currentTimeMillis());
sql.Timestamp:创建方法是一样的。这个年月日时分秒毫秒用的最多了。
Timestamp timestamp = new Timestamp(new java.util.Date().getTime());
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
其实我的建议,这几个获取不同格式的当前时间的方式,最好封装成单独的方法在工具包。因为在对数据库操作的时候经常要加上创建时间系统时间什么的~~~下面是我封装的方法,虽然很简单,但是如果有伸手党怎么也比手敲好。注:这个Date类型要看你导包导的什么类型
/**
* 获取当前系统时间
* @return
*/
public static Date getSystemDate() {
return new Date(System.currentTimeMillis());
}
获取当前Timestamp方法
/**
* 获取当前系统时间
* @return
*/
public static Timestamp getSystemTimestamp() {
return new Timestamp(System.currentTimeMillis());
}
因为很少有专门获取Time的时候,所以就不附代码了。真有需要了自己封装或者上面的改动下就好了。
接下来,sql.Date和util.Date的相互转化(其实sql.Time和sql.Timestamp和sql.Date大同小异。还有我导包的时候把sql.Date导入了,如果复制粘贴代码报错应该就是导包问题):
/**
* 将一个sql.Date转换成util.Date
*@return
*/
public static java.util.Date getDate(Date date){
return new java.util.Date(date.getTime());
}
/**
* 将一个util.Date转换成sql.Date
*
*/
public static Date getDate(java.util.Date date){
return new Date(date.getTime());
}
接下来重头戏!在业务种经常需要的。获取指定日期。获取当前日期前几天,后几天,前几年,后几年之类的(因为一般这种情况都是为了存数据库,所以我用sql.Date做演示):
想指定日期,不得不提就是刚刚掠过的日历类Calendar。之前也说过他是一个抽象类,所以创建Calendar用的是他的类方法getInstance。创建出来的自动是当前系统时间。只不过这个格式对观看来讲非常不友好。附上一个实例的打印结果:
java.util.GregorianCalendar[time=1561704518981,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2019,MONTH=5,WEEK_OF_YEAR=26,WEEK_OF_MONTH=5,DAY_OF_MONTH=28,DAY_OF_YEAR=179,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=48,SECOND=38,MILLISECOND=981,ZONE_OFFSET=28800000,DST_OFFSET=0]
对,你没看错也没听错,这一大串是一个calendar打印出来的结果~~~所以说正常情况下我们只是用calendar做工具而不是直接用。如果对上面这个结果好奇的亲们可以自行百度。我记得是有什么时区,国家的区别来着。反正挺复杂,我是没记住。
然后继续说,我们可以在calendar基础上,对日期(年,月,日,时,分,秒)进行加减乘除(虽然我没用过乘除)。因为calendar对每个时间量都已经设定了常量名字,所以对着名字使用就可以了。其中年种的天,月中的天,星期中的天什么的应该比较好理解。比如说2月11号。在年中的天是42。在月中的天是11,在星期中的天。。额额额,我也不知道反正系统是知道的。我这里就是说个大概意思。然后calendar支持对每个字段的改动。set(field, value)。前面填字段名字(Calendar.就能看到支持的字段名),后面填想要的值。比如说三年后的今天,可以set(年的常量,get到今年的值+3)。同样三个月后也是这样,如果是想要取之前的日期,就是在当前值-想要去的值。大概情况就是这样,每个时间单位都可以单独设置。然后如果单位值过大会自动往上转换的。比如设置 月+36 和年+3是一样效果的。
这里有两种方式,一种某日期之前或之后写两种方法,还有一种某日期前后写一种方法,但是在当前日期之前参数是负数,之后是正数。其实是性质是差不多的,只不过两种方法写起来麻烦用起来顺手。一种方法写起来方便用起来习惯了应该也方便。可是我一直用两种方法,尤其是有了成型的工具包了,cv能解决的问题就不能叫问题。
ok,说了这么多下面直接上代码:
获取当前日期几年后的日期(因为是第一个所有有点注解,以后的没特殊情况就不写注解了):
/**
* 当前日期几年后的日期
*参数是具体的年数
* @throws ParseException
*/
public static Date afterYear(int year) throws Exception {
//获取calendar实例
Calendar curr = Calendar.getInstance();
//加上相应的年数
curr.set(Calendar.YEAR, curr.get(Calendar.YEAR) + year);
//这个实例的getTime()方法获取的是util.Date。因为我想要的是sql.Date所以在返回的时候要转换一下
java.util.Date date = curr.getTime();
//其实我觉得这里可以一部转换,但是为了让大家看明白所以分开写了
return new Date(date.getTime());
}
获取当前日期几年前的日期:
/**
* 获取当前日期几年前的日期
* @param year
* @return
* @throws Exception
*/
public static Date beforeYear(int year) throws Exception {
Calendar curr = Calendar.getInstance();
curr.set(Calendar.YEAR, curr.get(Calendar.YEAR) - year);
return new Date(curr.getTime().getTime());
}
获取当前日期几天后的日期(我这里用的年中的天,感觉这个比较常用吧):
/**
* 获取当前日期几天后的日期
* @param day
* @return
* @throws Exception
*/
public static Date afterDay(int day) throws Exception {
Calendar curr = Calendar.getInstance();
curr.set(Calendar.DAY_OF_YEAR, curr.get(Calendar.DAY_OF_YEAR) + day);
return new Date(curr.getTime().getTime());
}
获取当前日期几天前的日期:
/**
* 获取当前日期几天前的日期
* @param day
* @return
* @throws Exception
*/
public static Date beforeDay(int day) throws Exception {
Calendar curr = Calendar.getInstance();
curr.set(Calendar.DAY_OF_YEAR, curr.get(Calendar.DAY_OF_YEAR) - day);
return new Date(curr.getTime().getTime());
}
获取当前日期几个月后的日期:
/**
* 获取当前日期几个月后的日期
* @param month
* @return
* @throws Exception
*/
public static Date afterMonth(int month) throws Exception {
Calendar curr = Calendar.getInstance();
curr.set(Calendar.MONTH, curr.get(Calendar.MONTH) + month);
return new Date(curr.getTime().getTime());
}
获取当前日期几个月前的日期:
/**
* 获取当前日期几个月前的日期
* @param month
* @return
* @throws Exception
*/
public static Date beforeMonth(int month) throws Exception {
Calendar curr = Calendar.getInstance();
curr.set(Calendar.MONTH, curr.get(Calendar.MONTH) - month);
return new Date(curr.getTime().getTime());
}
差不多常用的就这么多了。如果看了还有不会的可以私聊我。还是那个态度,真有不懂的直接百度最效率了~~
额,本来想顺便谢谢数据库前后端时间日期传输啥的。。但是今天感觉没啥时间了,以后有空了开专贴说一下时间传输上的问题吧。
喏,手打不易,大家动动小手分享转发点赞评论啥的~~~~
网友评论