经典 求 两个 日期间的间隔。。。

本文介绍如何使用Java中的Date、Calendar及SimpleDateFormat类来获取两个日期之间的间隔天数。具体包括Date的基本使用、Calendar与GregorianCalendar的常见操作、SimpleDateFormat格式化日期的方法以及最终计算日期间隔的完整示例。

注明:如果想要看两日期间隔天数,则直接跳到"";前面为预备知识;


一、需要使用的类


(1)java.util.Date;

(2)java.util.Calendar;

(3)java.util.GregorianCalendar;

(4)java.text.SimpleDateFormat;


二、Date的用途


Date由于基本已经过时,现在所能使用的地方有几点:

(1)获得当前时间:Date date = new Date();

(2)Date和Calendar转换; (后面会讲)

(3)SimpleDateFormat的解析;(后面会讲)


三、Calendar和GregorianCalendar用法


Calendar被广泛使用是因为他能够很容易的取得所需要的属性,比如年、月、日、分、秒、毫秒、星期等;

常见用法:

(1)GregorianCalendar calendar = new GregorianCalendar(); 获得当前时间;

(2)calendar.setTime(Date date); //将date的时间设置到calendar中;

(3)Date calendar.getTime(); //将calendar转成Date类型;

(4)calendar.get(属性); //根据名称获得属性的值;

(5)calendar.getTimeInMillis(); //获得calendar时间的毫秒数; (是求两日期相差天数的关键)



四、SimpleDateFormat


SimpleDateFormat被广泛使用是因为他能够自定义日期显示的格式;

(1)y表示年; yyyy表示四位的年份,比如2011

(2)M表示月; MM表示两位的月份,比如11

(3)d表示天; dd表示两位的天数 ,比如11

常见用法:

(1)SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //设置日期显示格式为yyyy-MM-dd,比如2011-01-01

(2)Date date = sdf.parse(String str); //将字符串解析为Date类型的日期;比如"2011-01-01"解析成2011-01-01的日期;

(3)String str = sdf.format(Date date); //将日期格式化为字符串;


五、求两日期间隔天数


技巧:通过间隔毫秒数求出间隔的天数;
如果知道了间隔的毫秒数,则:
(1) long sec = milli/1000;
(2) long min = sec/60;
(3) long hour = min./60;
(4) long day = hour/24;
  1. packageorg.exam3;
  2. importjava.text.SimpleDateFormat;
  3. importjava.util.Date;
  4. importjava.util.GregorianCalendar;
  5. importjava.util.Scanner;
  6. publicclassTest{
  7. publicstaticvoidmain(String[]args)throwsException{
  8. Scannerin=newScanner(System.in);
  9. in.useDelimiter("\n");
  10. System.out.print("开始时间:");
  11. Stringstr1=in.next();
  12. System.out.println("\n结束时间:");
  13. Stringstr2=in.next();
  14. SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");
  15. Datedate1=sdf.parse(str1);
  16. Datedate2=sdf.parse(str2);
  17. GregorianCalendarcal1=newGregorianCalendar();
  18. GregorianCalendarcal2=newGregorianCalendar();
  19. cal1.setTime(date1);
  20. cal2.setTime(date2);
  21. <strong>longgap=(cal2.getTimeInMillis()-cal1.getTimeInMillis())/(1000*3600*24);//从间隔毫秒变成间隔天数</strong>
  22. System.out.println("\n相差"+gap+"天");
  23. }
  24. }


useDelimiter

public Scanner useDelimiter(Patternpattern)
将此扫描器的分隔模式设置为指定模式。
参数:
pattern - 分隔模式
返回:
此扫描器


<think>我们正在处理一个ABAP问题:计算两个日期之间的天间隔。 根据引用[1]中的代码片段,我们看到了一个使用函`DAY_ATTRIBUTES_GET`来获取日期属性,并排除星期六和星期天的例子。但是用户没有提到要排除周末,所以我们需要的是计算包括所有日期的总天。 然而,在ABAP中,计算两个日期之间的天可以直接使用减法,因为ABAP的日期类型是字符类型但可以按字进行运算(内部表示为YYYYMMDD,因此直接相减得到天差)。 但是,我们也要考虑用户可能需要更复杂的场景,比如排除节假等。不过用户的问题只是要间隔”,没有特殊要,所以最简单的就是日期相减。 引用[3]提到了一个函`FIMA_DAYS_AND_MONTHS_AND_YEARS`,这个函可以计算两个日期之间的天和年,但用户只关心天。 因此,我们可以提供两种方法: 1. 直接使用减法:天 = 日期2 - 日期1。 2. 使用函`FIMA_DAYS_AND_MONTHS_AND_YEARS`(如果用户需要更详细的间隔,包括年、)。 注意:直接减法得到的天包括起始日期吗?在ABAP中,日期相减得到的是两个日期之间的天差,不包括起始日期(即从日期1到日期2经过的天,不包括日期1当天,包括日期2?)但是实际上,日期相减得到的是两个日期相差的天,例如:20200102 - 20200101 = 1。 然而,根据业务需,有时可能需要包括起始日期,比如计算从某一天到某一天的总天(包括头尾),那么就需要在结果上加1。但用户问题没有明确,所以一般我们按自然天差(即两个日期之间的天,不包括起始日期,包括结束日期?)实际上,在计算两个日期之间的“间隔”时,通常是指从日期1到日期2所经过的天,即日期2减去日期1。 所以,我们给出直接减法的方法,并说明可以根据需要调整。 另外,引用[1]中使用了`DAY_ATTRIBUTES_GET`函,这个函可以获取日期的属性(比如是否是周末),如果用户需要排除周末和节假,则需要使用类似方法。但当前用户需没有提到排除,所以我们先提供简单方法。 步骤: 1. 声明两个日期变量,比如:DATA: lv_date1 TYPE sy-datum, lv_date2 TYPE sy-datum. 2. 计算天:DATA(lv_days) = lv_date2 - lv_date1. 注意:如果日期2早于日期1,结果为负。所以我们可以取绝对值,或者确保日期2大于日期1。 但是,如果用户需要包括节假排除,那么就需要使用工厂历。不过用户没有提到,因此我们只回答基本方法。 因此,回答如下: </think>在ABAP中计算两个日期之间的天间隔,主要有以下两种常用方法: ### 1. 直接日期减法(最简单) ABAP的日期类型(`sy-datum`)可直接相减,结果为整: ```abap DATA: lv_date1 TYPE sy-datum VALUE &#39;20240101&#39;, lv_date2 TYPE sy-datum VALUE &#39;20240110&#39;, lv_days TYPE i. lv_days = lv_date2 - lv_date1. WRITE: / &#39;间隔:&#39;, lv_days. " 输出结果:9 ``` ### 2. 使用函 `FIMA_DAYS_AND_MONTHS_AND_YEARS`(推荐) 当需要精确处理闰年等特殊情况时,推荐使用标准函: ```abap DATA: lv_date_from TYPE sy-datum VALUE &#39;20240101&#39;, lv_date_to TYPE sy-datum VALUE &#39;20240110&#39;, lv_days TYPE i. CALL FUNCTION &#39;FIMA_DAYS_AND_MONTHS_AND_YEARS&#39; EXPORTING i_date_from = lv_date_from i_date_to = lv_date_to IMPORTING e_days = lv_days. WRITE: / &#39;间隔:&#39;, lv_days. " 输出结果:9 ``` ### 注意事项: 1. **日期格式**:必须为`YYYYMMDD`格式(如`20240101`) 2. **结果处理**: - 日期相减时:结束日期需 >= 开始日期,否则结果为负 - 函计算:自动处理闰年,结果恒为非负整 3. **排除周末/节假**: - 若需排除周六周(如引用[1]),需结合`DAY_ATTRIBUTES_GET`函 - 工厂历处理节假需维护`HOLIDAY_CALENDAR`参 > 例如排除周末的步骤: > 1. 调用`DAY_ATTRIBUTES_GET`获取日期属性表(`LT_WEEK`) > 2. 过滤`WEEKDAY = &#39;6&#39;(周六)`或`&#39;7&#39;(周)`的日期 > 3. 从总天中减去这些天[^1] --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值