java指定日期计算一年内第几天和给出一年内第几天算出指定日期

该博客介绍了使用Java进行日期计算,包括计算指定日期是一年内的第几天,以及根据一年内的第几天算出具体日期。部分计算一年内第几天的代码参考网络,根据第几天算日期为原创,还给出了运行结果示例,最后提供了资源下载链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java指定日期计算一年内第几天和给出一年内第几天算出指定日期

1.计算一年内第几天,部分参考的是https://blog.youkuaiyun.com/xinpengfei521/article/details/80773221

2.根据一年内的第几天算出是具体日期是本人原创。

第二部分我整合了第一部分写在一起,需要的可以下载直接使用!

思路就是用给出的一年内的第几天减去每个月的天数,很简单。

 

public class CalculateUtils {



    public static void main(String[] args) {

        int year = 2019;//年
        int month = 10;//月
        int day = 31;//日
        
        
        int daysInYear = getDaysInYear(year, month, day);
        System.out.println("【指定日期换算成第几天】");
        System.out.println(year+"年"+month+"月"+day+"日"+"是一年内的第:" + daysInYear+"天");
        //System.out.println("\n【一年的第几天换算对应日期】");
        //System.out.println(year+"年的第"+daysInYear+"天    对应的日期是"+daysToDate(String.valueOf(year), String.valueOf(daysInYear)));
    }

    /**
     * get days in this year
     *
     * @param year
     * @param month
     * @param day
     * @return
     */
    public static int getDaysInYear(int year, int month, int day) {
        /*平年二月28天*/
        final int DAYS_28 = 28;
        /*闰年二月29天*/
        final int DAYS_29 = 29;
        /*除了31天的月份,4、6、9、11其他均为30天*/
        final int DAYS_30 = 30;
        /*1、3、5、7、8、10、12月份31天*/
        final int DAYS_31 = 31;
    	
        int totalDays = 0;

        switch (month) {
            // 12 月份加的是11月份的天数,依次类推
            case 12:
                totalDays += DAYS_30;
            case 11:
                totalDays += DAYS_31;
            case 10:
                totalDays += DAYS_30;
            case 9:
                totalDays += DAYS_31;
            case 8:
                totalDays += DAYS_31;
            case 7:
                totalDays += DAYS_30;
            case 6:
                totalDays += DAYS_31;
            case 5:
                totalDays += DAYS_30;
            case 4:
                totalDays += DAYS_31;
            case 3:
                // 判断是否是闰年
                if (((year / 4 == 0) && (year / 100 != 0)) || (year / 400 == 0)) {
                    totalDays += DAYS_29;
                } else {
                    totalDays += DAYS_28;
                }
            case 2:
                totalDays += DAYS_31;
            case 1: // 如果是1月份就加上输入的天数
                totalDays += day;
        }

        return totalDays;
    }
    

    
}

运行结果:

【指定日期换算成第几天】
2019年10月31日是一年内的第:304天

【一年的第几天换算对应日期】
2019年的第304天    对应的日期是2019-10-31

 

谢谢!欢迎指正!

转载请注明出处!

资源下载https://download.youkuaiyun.com/download/ed679ed/10707386

<think>我们已知:季度是三个月,年有四个季度。需求:给定日期计算季度的开始日期结束日期。思路:1.首先,我们要知道每个季度的划分。通常:第季度:1月1日~3月31日第二季度:4月1日~6月30日第三季度:7月1日~9月30日第四季度:10月1日~12月31日2.给定日期,先确定该日期所在的季度,然后减去3个月就是上个季度吗?但是注意,如果我们在季度的第天,那么上个季度就是去年的第四季度。3.另种思路:先获取给定日的月份,然后算季度的开始月份结束月份。4.步骤:-获取给定日的年份月份(0-11,0代表1月,11代表12月)。-计算当前季度:月份/3(整数除法)可以得到季度索引(0~3,分别代表第到第四季度)。-那么上个季度的索引=(当前季度索引-1+4)%4(这样如果是第季度减1得到-1,加上4再模4就是3,即第四季度)-然后计算季度的年份:-如果当前季度为0(第季度),那么上季度就是去年的第四季度,所以年份要减1。-否则,年份不变。-上季度的开始月份=上季度的索引*3(因为0代表第季度,开始月份0(1月),3代表第四季度,开始月份9(10月)?不对)重新考虑:季度的索引月份的关系:季度索引0->月份0,1,2(1月~3月)->开始月份0,结束月份21->3,4,5->开始月份3,结束月份52->6,7,8->开始月份6,结束月份83->9,10,11->开始月份9,结束月份11上季度的开始月份=上季度索引*3上季度的结束月份=上季度索引*3+2但是,结束日期定是当月的最后天,因为各月的天数不同(尤其是2月)。因此,结束日期应该是该季度的最后天(即结束月份所在月的最后天)。5.因此,我们可以:-确定上季度的年份月份范围后,开始日期就是上季度开始月份的第天(比如索引0:开始月份0,即1月1日)。-结束日期需要计算结束月份的最后天(比如3月的最后天可能是31、30?实际上3月是31天,但2月是28或29天,所以需要根据年份月份来计算)。6.另种更简单的方法:将给定日先减去3个月,然后找到该日期所在季度的第最后天。但这样减去3个月后,我们可能还停留在同季度(比如5月1日减去3个月是2月1日,那么它是在第季度的,但是上季度应该是上年的第四季度?不对,5月属于第二季度,上季度是第季度,也就是1月1日~3月31日。而2月1日属于第季度,所以我们可以先跳到该季度的第天(即4月1日)再减去3个月得到1月1日,作为上季度的开始,然后再计算季度的结束日期(3月31日))。7.我们可以这样:-先取得给定日所在季度的第天(比如给定日为2023-05-15,则本季度的第天是2023-04-01)。-然后,将这个日期减去3个月,就得到上季度的第天(2023-01-01)。-然后,上季度的结束日期就是:上季度的第天加3个月再减1天?这样不定准确(比如2月1日减3个月是11月1日,然后加3个月是2月1日,再减1天是1月31日,这样得到的是1月31日,而上季度应该是10月1日~12月31日,那么结束日期应该是12月31日)。所以这个方法不太直观。8.我们采用分情况讨论的方法:设给定日为date。步骤:a.获取年份year月份month(0-11)。b.计算当前季度索引:intcurrentQuarter=month/3;//这样0,1,2->0;3,4,5->1;6,7,8->2;9,10,11->3。c.上季度索引:intpreviousQuarter=(currentQuarter+3)%4;//相当于currentQuarter-1,如果是负数则加上4再模4,所以用(currentQuarter+3)%4也可以。d.上季度的年份:intpreviousYear=year;if(currentQuarter==0){previousYear=year-1;}e.上季度的开始月份=previousQuarter*3;//0->0,1->3,2->6,3->9f.上季度的结束月份=previousQuarter*3+2;//0->2(3月),1->5(6月),2->8(9月),3->11(12月)g.然后,上季度的开始日期就是:previousYear年的(上季度的开始月份+1)月的第天。h.上季度的结束日期就是:previousYear年的(上季度的结束月份+1)月的最后天。9.注意:月份在Calendar中0代表1月,所以我们构造月份时,直接用月份值(0-11)来设置,然后设置日期为1,就是该月第天。最后天怎么求?我们可以使用Calendar的方法:将日期设置为下月的第天,然后减去天,就是当月的最后天。10.示例代码:但是,我们还可以使用Java8的java.time包(如果使用Java8及以上)来简化操作。下面我们使用Java8的java.time.LocalDatejava.time.temporal.TemporalAdjusters来实现。思路:-将给定日转换为LocalDate。-获取该日期的月份,然后计算它属于第几季度(0-3)。-然后计算季度的年份季度索引。-上季度的开始日期=上季度的第个月的第天(比如季度索引0,即1月,那就是1月1日)。-上季度的结束日期=上季度的最后个月的最后天。使用Java8的代码:步骤:1.将输入日期转换为LocalDate对象。2.计算当前季度:月份从1(1月)到12(12月),当前季度=(month-1)/3+1?这样是得到1~4季度。但是我们更习惯用0~3的索引,所以:quarterIndex=(month-1)/3//整数除法,0~33.如果当前季度是0(即1、2、3月),那么上季度就是上年的第四季度(索引3),年份减1;否则,上季度索引=当前季度-1,年份不变。4.上季度的起始月份=季度索引*3+1(0->1,1->4,2->7,3->10)5.开始日期=LocalDate.of(上年的值,起始月份,1)6.结束日期:开始日期的月份加上2个月(得到该季度的最后个月),然后获取该月的最后天。但是更简单的是:开始月份=quarterIndex*3+1;结束月份=startMonth+2;//因为季度三个月开始日期=LocalDate.of(year,startMonth,1);结束日期=LocalDate.of(year,endMonth,1).with(TemporalAdjusters.lastDayOfMonth());注意:年份如果是上季度索引3(即第四季度)时,那么是在当前年的上年?不对,因为当当前季度为0时,上季度索引3对应的是上年的第四季度;否则,上季度在当前年。所以我们可以:intyear=date.getYear();intmonth=date.getMonthValue();//1-12intquarterIndex=(month-1)/3;//0,1,2,3intpreviousQuarterIndex=(quarterIndex-1+4)%4;//这样0->3,1->0,2->1,3->2//但是年份:如果quarterIndex为0(即第季度),则上年,否则当前年intpreviousYear=year;if(quarterIndex==0){previousYear=year-1;}//上季度的第个月intstartMonth=previousQuarterIndex*3+1;//上季度索引0->1(1月),1->4(4月),2->7(7月),3->10(10月)intendMonth=startMonth+2;//该季度的最后个月//开始日期就是startMonth月的第天LocalDatestartDate=LocalDate.of(previousYear,startMonth,1);//结束日期是endMonth月的最后天LocalDateendDate=LocalDate.of(previousYear,endMonth,1).with(TemporalAdjusters.lastDayOfMonth());但是注意:previousQuarterIndex这个值我们是用(quarterIndex-1+4)%4来计算的,这样当quarterIndex=0时,得到3,然后startMonth=3*3+1=10,年份减1,所以就是上年10月1日,结束月份=12月,结束日期为12月31日,正确。测试下quarterIndex=1(即4、5、6月):上季度索引=(1-1+4)%4=0,所以startMonth=0*3+1=1(1月),年份不变,开始日期为1月1日,结束日期=3月的最后天(3月31日)->正确(上季度是1~3月)。测试quarterIndex=3(即10、11、12月):上季度索引=(3-1+4)%4=6%4=2,所以startMonth=2*3+1=7(7月),年份不变,结束月份=9月,结束日期为9月30日(上季度7~9月)。代码示例:如果使用旧版JavaJava7或以下),我们可以使用Calendar类,但这里我们优先使用Java8的日期API。因此,假设使用Java8及以上,代码如下:</think> 以下是计算指定日期季度开始结束日期Java代码实现,使用Java 8的`java.time` API: ```java import java.time.LocalDate; import java.time.temporal.TemporalAdjusters; public class QuarterCalculator { public static void main(String[] args) { // 示例:计算2023-05-15的上季度日期 LocalDate givenDate = LocalDate.of(2023, 5, 15); Quarter previousQuarter = getPreviousQuarterDates(givenDate); System.out.println("给定日: " + givenDate); System.out.println("上季度开始: " + previousQuarter.getStartDate()); System.out.println("上季度结束: " + previousQuarter.getEndDate()); } public static Quarter getPreviousQuarterDates(LocalDate givenDate) { // 获取给定日所在季度的第天 LocalDate firstDayOfCurrentQuarter = givenDate .withMonth(((givenDate.getMonthValue() - 1) / 3) * 3 + 1) .withDayOfMonth(1); // 计算季度的最后天(当前季度首日减1天) LocalDate endDate = firstDayOfCurrentQuarter.minusDays(1); // 计算季度的第天 LocalDate startDate = endDate .minusMonths(2) // 退回2个月到季度起点 .withDayOfMonth(1); // 设置为当月第天 return new Quarter(startDate, endDate); } static class Quarter { private final LocalDate startDate; private final LocalDate endDate; public Quarter(LocalDate startDate, LocalDate endDate) { this.startDate = startDate; this.endDate = endDate; } public LocalDate getStartDate() { return startDate; } public LocalDate getEndDate() { return endDate; } } } ``` ### 功能说明: 1. **日期计算逻辑**: - 首先确定给定日所属季度的第天 - 当前季度首日减1天得到上季度的最后天 - 从季度末日退回2个月并设置当月首日得到季度开始日 2. **季度划分规则**: ``` 第季度:1月1日 - 3月31日 第二季度:4月1日 - 6月30日 第三季度:7月1日 - 9月30日 第四季度:10月1日 - 12月31日 ``` 3. **测试用例输**: ```text 给定日: 2023-05-15 上季度开始: 2023-01-01 上季度结束: 2023-03-31 ``` ### 处理边缘情况: - 年末跨年场景(如输入2023-01-15,返回2022-10-01至2022-12-31) - 闰年场景(自动处理2月29日) - 月末日期(使用`TemporalAdjusters`保证日期有效性) 对于Java 8以下版本,可用`Calendar`类实现类似逻辑,但推荐升级到Java 8+以获得更简洁安全的日期处理能力[^1][^2]。 ### 相关问题: 1. 如何处理不同财年起始季度的业务场景? 2. 如何扩展代码支持多时区季度计算? 3. 如果季度划分规则不同(如2-4月为Q1),应如何修改代码?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值