• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

Android

Java计较时差、日期差总结

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/Android/2019/0804/591.html

 
 
近来常州平台运营事情中碰到必要计较光阴差,搜刮了几种计较光阴差的要领,这里总结一下
 
 
 
1、java 7中的日历类Calendar
 
Calendar类应用其静态的getInstance()要领获取一个日历实例,该实例为目前的光阴;要是想转变光阴,能够通过其setTime要领传入一个Date工具,即可获取Date工具所显露光阴的Calendar工具
 
 
 
/**
 
 *应用Calendar工具计较光阴差,能够按照需要定制本人的计较逻辑
 
 * @param strDate
 
 * @throws ParseException
 
 */
 
public static void calculateTimeDifferenceByCalendar(String strDate) throws ParseException {
 
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
 
    Date date = formatter.parse(strDate);
 
 
 
    Calendar c1 = Calendar.getInstance();   //目前日期
 
    Calendar c2 = Calendar.getInstance();
 
    c2.setTime(date);   //设置为另一个光阴
 
 
 
    int year = c1.get(Calendar.YEAR);
 
    int oldYear = c2.get(Calendar.YEAR);
 
 
 
    //这里只是简略的对两个年份数字举行相减,而没有思量月份的环境
 
    System.out.println("传入的日期与今年的年份差为:" + (year - oldYear));
 
}
 
 
输出为:
 
 
 
传入常州微信公众平台的日期与今年的年份差为:12
 
1
 
2、java 8中的周期类Period
 
通过挪用Period类的静态要领between,传入两个待对照的LocalDate工具today与oldDate,得到的Period的工具p中就包括了today与oldDate两个日期相差的年、月、日信息,能够通过p.getYears()等要领取出
 
 
 
/**
 
 * 应用java 8的Period的工具计较两个LocalDate工具的光阴差,严酷按照年、月、日计较,如:2018-03-12 与 2014-05-23 相差 3 年 9 个月 17 天
 
 * @param year
 
 * @param month
 
 * @param dayOfMonth
 
 */
 
public static void calculateTimeDifferenceByPeriod(int year, Month month, int dayOfMonth) {
 
    LocalDate today = LocalDate.now();
 
    System.out.println("Today:" + today);
 
    LocalDate oldDate = LocalDate.of(year, month, dayOfMonth);
 
    System.out.println("OldDate:" + oldDate);
 
 
 
    Period p = Period.between(oldDate, today);
 
    System.out.printf("指标日期距离本日的光阴差:%d 年 %d 个月 %d 天\r", p.getYears(), p.getMonths(), p.getDays());
 
}
 
 
输出为:
 
 
 
Today:2018-03-13
 
OldDate:2014-05-23
 
常州微信小程序开发指标日期距离本日的光阴差:3 年 9 个月 18 天
 
1
 
2
 
3
 
3、java 8中的Duration类
 
Duration与Period相对应,Period用于处分日期,而Duration计较光阴差还能够处分详细的光阴,也是通过挪用其静态的between要领,该要领的署名是between(Temporal startInclusive, Temporal endExclusive),是以能够传入两个Instant的实例(Instant完成了Temporal接口),并能够以毫秒(toMillis)、秒(getSeconds)等多种形式显露得到的光阴差
 
 
 
public static void calculateTimeDifferenceByDuration() {
 
    Instant inst1 = Instant.now();  //目前的光阴
 
    System.out.println("Inst1:" + inst1);
 
    Instant inst2 = inst1.plus(Duration.ofSeconds(10));     //目前光阴+10秒后的光阴
 
    System.out.println("Inst2:" + inst2);
 
    Instant inst3 = inst1.plus(Duration.ofDays(125));       //目前光阴+125天后的光阴
 
    System.out.println("inst3:" + inst3);
 
 
 
    System.out.println("以毫秒计的光阴差:" + Duration.between(inst1, inst2).toMillis());
 
 
 
    System.out.println("以秒计的光阴差:" + Duration.between(inst1, inst3).getSeconds());
 
}
 
 
输出为:
 
 
 
Inst1:2018-03-13T09:06:00.691Z
 
Inst2:2018-03-13T09:06:10.691Z
 
inst3:2018-07-16T09:06:00.691Z
 
以毫秒计的光阴差:10000
 
以秒计的光阴差:10800000
 
1
 
2
 
3
 
4
 
5
 
4、java 8中的ChronoUnit类
 
ChronoUnit的between要领署名为,between(Temporal temporal1Inclusive, Temporal temporal2Exclusive),必要留意的是,要是要以差别的单元展现光阴差,between入参中的光阴工具必需包括有对应的光阴信息,不然会抛出java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit XXX的异常
 
 
 
/**
 
 * 应用java 8的ChronoUnit,ChronoUnit能够以多种单元(基本涵盖了全部的,看源码发现果然另有“FOREVER”这种单元。。)显露两个光阴的光阴差
 
 */
 
public static void calculateTimeDifferenceByChronoUnit() {
 
    LocalDate startDate = LocalDate.of(2003, Month.MAY, 9);
 
    System.out.println("首先常州网站开发建设光阴:" + startDate);
 
 
 
    LocalDate endDate = LocalDate.of(2015, Month.JANUARY, 26);
 
    System.out.println("结束光阴:" + endDate);
 
 
 
    long daysDiff = ChronoUnit.DAYS.between(startDate, endDate);
 
    System.out.println("两个光阴之间的天数差为:" + daysDiff);
 
//  long hoursDiff = ChronoUnit.HOURS.between(startDate, endDate);  //这句会抛出异常,由于LocalDate显露的光阴中不包括时分秒等信息
 
}
输出为:
 
 
 
首先光阴:2003-05-09
 
结束光阴:2015-01-26
 
两个光阴之间的天数差为:4280
 
1
 
2
 
3
 
5、古代的SimpleDateFormat类
 
用SimpleDateFormat计较光阴差的要领,网上找了一份,本人跑了一遍,能够应用,贴在下面
 
 
 
/**
 
* 用SimpleDateFormat计较光阴差
 
* @throws ParseException 
 
*/
 
public static void calculateTimeDifferenceBySimpleDateFormat() throws ParseException {
 
    SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd hh:妹妹");
 
    /*天数差*/
 
    Date fromDate1 = simpleFormat.parse("2018-03-01 12:00");  
 
    Date toDate1 = simpleFormat.parse("2018-03-12 12:00");  
 
    long from1 = fromDate1.getTime();  
 
    long to1 = toDate1.getTime();  
 
    int days = (int) ((to1 - from1) / (1000 * 60 * 60 * 24));  
 
    System.out.println("两个光阴之间的天数差为:" + days);
 
 
 
    /*小时差*/
 
    Date fromDate2 = simpleFormat.parse("2018-03-01 12:00");  
 
    Date toDate2 = simpleFormat.parse("2018-03-12 12:00");  
 
    long from2 = fromDate2.getTime();  
 
    long to2 = toDate2.getTime();  
 
    int hours = (int) ((to2 - from2) / (1000 * 60 * 60));
 
    System.out.println("两个光阴之间的小时差为:" + hours);
 
 
 
    /*游戏开发运营分钟差*/
 
    Date fromDate3 = simpleFormat.parse("2018-03-01 12:00");  
 
    Date toDate3 = simpleFormat.parse("2018-03-12 12:00");  
 
    long from3 = fromDate3.getTime();  
 
    long to3 = toDate3.getTime();  
 
    int minutes = (int) ((to3 - from3) / (1000 * 60));  
 
    System.out.println("两个光阴之间的分钟差为:" + minutes);
 
}
 
 
输出为:
 
 
 
两个光阴之间的天数差为:11
 
两个光阴之间的小时差为:264
 
两个光阴之间的分钟差为:15840
 
1
 
2
 
3
 
总结
 
古代的SimpleDateFormat和Java 7中的Calendar在应用的时候必要本人写一个计较光阴差的逻辑,对照繁难,不过却对照灵活,利便凭据本人详细的需要来定制(好比,我想两个日期的天数差15天就算满一个月,不满15天不算一个月,如2018-01-04到2018-02-20,算2个月的光阴差);而Java 8中的几个计较光阴差的类加倍利便、精确,能够以差别的单元显露得到的光阴差,但要留意几个类所包括的光阴信息的差别:
 
 
 
System.out.println(LocalDate.now());        //只包括日期信息
 
System.out.println(LocalTime.now());        //只包括光阴信息
 
System.out.println(LocalDateTime.now());        //包括日期、光阴信息
 
1
 
2
 
3
 
输出为:
 
 
 
2018-03-13
 
17:13:26.134
 
2018-03-13T17:13:26.135
 
1
 
2
 
3
 
以上总结的几个要领只是个例子,常州手游开发详细应用的时候可能必要传入一个大概两个光阴举行对照,可能会涉及到这些光阴工具的互相转换,Instant、Date、LocalDate等等。。。我就不枚举了。。。 
 
另外在应用SimpleDateFormat对String类型的日期举行parse的时候,要是传入的日期为:2017-08-60,这种错误的日期,Java默认会按照日期的信息对其举行转换,formatter.parse("2017-08-60");,得到的日期为2017-09-29,而要是不想举行这种转换,而干脆将其判定为输入错误,则能够设置formatter.setLenient(false);,这时就会抛出java.text.ParseException异常了
 
 
 
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
 
formatter.setLenient(false);
 
try {
 
    Date date = formatter.parse("2017-08-60");  //抛出转换异常
 
    System.out.println(date);
 
} catch (ParseException e) {
 
    e.printStackTrace();
 
}
 
 
 

上篇:上一篇:SQLite数据库存储(建、增、改、删查)
下篇:下一篇:Android中几种常用的按时器和延时方法