java中转换日期_java中时间日期格式讲解和转换方法

额,其实做项目一个无可避免的工具包就是时间日期格式的转换。因为时间久了所以自己也存了好多关于转换的方法之类的。但是有时候就会不满足需求,手写一时半会儿还写不出来(我不知道是不是我太菜了,知道某类大概有什么什么方法,但是让我纯靠记忆手敲却敲不出来,只能靠万能的百度啦~~)

所以在今天需要找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());

}

差不多常用的就这么多了。如果看了还有不会的可以私聊我。还是那个态度,真有不懂的直接百度最效率了~~

额,本来想顺便谢谢数据库前后端时间日期传输啥的。。但是今天感觉没啥时间了,以后有空了开专贴说一下时间传输上的问题吧。

续:今天有人提醒我把jdk8中的时间日期的三个类加上~~所以写个续集

jdk8中提供三个类(LocalDate,LocalTime,LocalDateTime),它们分别对年月日、时分秒和年月日时分秒进行单独的处理。其实从名字上看就能看出来。我总觉得现在的英文越来越友好了~~哈哈

然后用法很简单。

1)获取当前时间和单独的时间单位的值(说实话我觉得就是这两个方法calendar的升级版~~更加简单了,但是功能真的是差不多!!)

//获取今天的日期   年月日

LocalDate todayDate = LocalDate.now();

//获取此刻的时间   时分秒毫秒

LocalTime now = LocalTime.now();

//获取此刻时间   年月日时分秒毫秒

LocalDateTime now = LocalDateTime.now();

//获取单独是年月日时分秒的值

年:now.getYear();(月日时分秒不演示了~反正就是这样的。自己看图吧。然后规则和calendar差不多。什么年中第几天月中第几天啥的)

57b351e36abc

LocalDateTime的方法

2)获取指定时间。对比着讲:以前想获取指定时间还得日历类来回来去set。而现在被封装的更加方便了。(这些有多个重载。比如你只传两个参数则是前两个单位的值。但是我觉得不太常用吧~~反正知道就好~~就不特意解释了)

//三个参数分别是年  月 日

LocalDate of1 = LocalDate.of(2019, 7,16);

//三个参数时 分 秒

LocalTime of2 = LocalTime.of(17, 03, 36);

//这个比较有意思,datatime既可以自己设置,也可以localDate和 localTime直接组成

LocalDateTime of3 = LocalDateTime.of(of1, of2);

LocalDateTime of4 = LocalDateTime.of(2019, 7, 16, 1, 2, 3);

3)判断两个时间是否相等

这个咋说呢~~用的是equals方法。然后比较的机制必须全等。

57b351e36abc

时间日期比较结果(红框是结果)

4)判断指定日期是不是给定的一个星期单位(写的好费劲,通俗讲判断某天是不是周一或周二之类的):DayOfWeek from1 = DayOfWeek.from(LocalDate.of(1995, 5, 26));

if (from1.equals(of)) {

System.out.println("该日期是周四");

} else {

System.out.println("该日期不是周四");

}

5)指定时间的之前或者之后的时间(calendar既视感。我不知道为啥不直接在构造的时候就做成想要的。。存在即合理吧):LocalDateTime now = LocalDateTime.now();

System.out.println("当前时间"+now);

System.out.println("当前时间之前2天:"+now.minusDays(2));

System.out.println("当前时间之后2天:"+now.plusDays(2));

System.out.println("当前时间之前2周:"+now.minusWeeks(2));

System.out.println("当前时间之后2周:"+now.plusWeeks(2));

System.out.println("当前时间之前2月:"+now.minusMonths(2));

System.out.println("当前时间之后2月:"+now.plusMonths(2));

System.out.println("当前时间之前2年:"+now.minusYears(2));

System.out.println("当前时间之后2年:"+now.plusYears(2));

System.out.println("当前时间之前2小时:"+now.minusHours(2));

System.out.println("当前时间之后2小时:"+now.plusHours(2));

System.out.println("当前时间之前2分钟:"+now.minusMinutes(2));

System.out.println("当前时间之后2分钟:"+now.plusMinutes(2));

System.out.println("当前时间之前2秒:"+now.minusSeconds(2));

System.out.println("当前时间之后2秒:"+now.plusSeconds(2));

6)比较时间的前后(以前一般都是换成时间戳比较,感觉这个方法还是挺实用的):

//time1是在time2之前么。返回值是boolean值。是返回true。不是返回false。

time1.isBefore(time2);

//time1是在time2之后么。返回值是boolean值。是返回true。不是返回false。

time1.isAfter(time2);

7)格式化和解析(这里成功的取代了SimpleDateFormat):

LocalDateTime now = LocalDateTime.now();

//我反正是用SimpleDateFormat来理解的~~其实功能也就是一样~~单词还贼长~~哎

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");

DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("HH:mm:ss");

//格式化

String format = now.format(formatter);

String format2 = now.format(formatter2);

String format3 = now.format(formatter3);

//解析

LocalDateTime localDateTime = LocalDateTime.parse(format, formatter);

LocalDate localDate = LocalDate.parse(format2, formatter2);

LocalTime localTime = LocalTime.parse(format3, formatter3);

jdk8中这三个时间类也就这样了。正好我最近做了一个小工具方法用到了这个,所以贴出来供参考:/**

* 获取今天到当前时间所过的毫秒数

* @return

*/

public static long getSystemtime() {

//获取当前时间的毫秒数,再减去今天0点0分0秒0毫秒的毫秒数。

long time =new java.util.Date().getTime();

//获取今天0点0分0秒0毫秒的时间

LocalDate date = LocalDate.now();

LocalTime startTimes = LocalTime.of(0, 0, 0);

//获取今天0点0分0秒0毫秒的时间的毫秒数.这里的+8是因为中国在东八区

long startTime = LocalDateTime.of(date,startTimes).atZone(ZoneId.of("+8")).toInstant().toEpochMilli();;

return time+startTime;

}

差不多就这样了~~以后再有补充的再续写吧~~感谢群里的大大提的意见~~

喏,手打不易,大家动动小手分享转发点赞评论啥的~~~~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值