java周切分,按照指定weekday为一周的开始

本文介绍如何在Java中实现自定义周概念,以周六为一周的开始,详细阐述了从输入日期计算周号的过程,包括处理跨年情况,并提供了相应代码示例。

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

目标:扩充周的概念为周六到周五、周四到周三。也即认为一周的开始是周六而不是java默认的周末

输入:start_date,end_date

输出:XX年XX周

首先,周切分

以周六到周五为例,先拿到start_date所在的年份的第一个周六FirstSaturday作为第一周,将start_date向后拨到第一个周六,然后计算start_date与FirstSaturday之间相差了多少天,在整除7即可知道start_date所在的周六是本年的第几周。

end_date的处理与start_date类似,需要注意跨年的情况,将end_date向前拨到第一个周五。

对于FirstSaturday的计算时,注意,不仅要调整年、月、日,还要调整时、分、秒。如果不调整时、分、秒,那么计算出来的FirstSaturday的时分秒将会是当前的时分秒,在计算start_date与FirstSaturday之间相差多少天时,由于采用的是时间戳相减,而时间上不到24小时就会认为不是一天,就会带来误差。具体例子可以看:http://www.cnblogs.com/0201zcr/p/5000977.html

所以FirstSaturday的计算如下:

FirstSaturday = Calendar.getInstance();
FirstSaturday.set(startCal.get(Calendar.YEAR), Calendar.JANUARY, 1, 0, 0, 0);//重要!!!
while (FirstSaturday.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
       FirstSaturday.add(Calendar.DAY_OF_YEAR, 1);
}

注意跨年的情况。当跨年时,我们需要重新计算FirstSaturday。这里只需要将年份重新变更,比如2015跨2016时,之前FirstSaturday是2015年的第一个周六,那么跨年时,将FirstSaturday改成2016年的第一个周六即可。

具体代码如下:

//计算开始日期是第几周
long beginWeekNum = (startCal.getTimeInMillis() / 1000 - FistSaturday.getTimeInMillis() / 1000) / SevenDay + 1;
String beginWeek = String.valueOf(beginWeekNum);
if (beginWeekNum < 10) {
   beginWeek = "0" + beginWeekNum;
}
//计算结束日期是第几周
FistSaturday = Calendar.getInstance();
FistSaturday.set(endCal.get(Calendar.YEAR), Calendar.JANUARY, 1, 0, 0, 0);
while (FistSaturday.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
     FistSaturday.add(Calendar.DAY_OF_YEAR, 1);
}
long endWeekNum = (endCal.getTimeInMillis() / 1000 - FistSaturday.getTimeInMillis() / 1000) / SevenDay + 1;
String endWeek = String.valueOf(endWeekNum);
if (endWeekNum < 10) {
    endWeek = "0" + endWeekNum;
}


对于需要计算某段时间内具体每周的周号、每周的开始时间和结束时间的代码,如下:

import java.text.SimpleDateFormat;
import java.util.*;

/**
 *
 * @author zhaoruixing
 */
public class WeekHelper {

    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    private static long SevenDay = 604800;

    /**
     * @param startDate
     * @param endDate
     * @param args the command line arguments
     * @return
     */
    public static List<Week> getWeekSplit(Date startDate, Date endDate) {
        ArrayList<Week> WeekList = new ArrayList<>();
        Calendar startCal = Calendar.getInstance();
        startCal.setTime(startDate);
        Calendar endCal = Calendar.getInstance();
        endCal.setTime(endDate);

        Calendar FistSaturday = Calendar.getInstance();
        FistSaturday.set(startCal.get(Calendar.YEAR), Calendar.JANUARY, 1, 0, 0, 0);
        while (FistSaturday.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
            FistSaturday.add(Calendar.DAY_OF_YEAR, 1);
        }

        while (startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
            startCal.add(Calendar.DAY_OF_YEAR, 1);
        }
        while (endCal.get(Calendar.DAY_OF_WEEK) != Calendar.FRIDAY) {
            endCal.add(Calendar.DAY_OF_YEAR, -1);
        }
        System.out.println(sdf.format(startCal.getTime()) + "\t" + sdf.format(endCal.getTime()));
        int startYear = startCal.get(Calendar.YEAR);
        while (startCal.compareTo(endCal) < 0) {
            int endYear = startCal.get(Calendar.YEAR);
            if (startYear < endYear) {
                FistSaturday.set(endYear, Calendar.JANUARY, 1, 0, 0, 0);
                while (FistSaturday.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
                    FistSaturday.add(Calendar.DAY_OF_YEAR, 1);
                }
                startYear = endYear;
            }
            Week everyWeek = new Week();
            long WeekNum = (startCal.getTimeInMillis() / 1000 - FistSaturday.getTimeInMillis() / 1000) / SevenDay + 1;
            String WeekNumStr = String.valueOf(WeekNum);
            if (WeekNum < 10) {
                WeekNumStr = "0" + WeekNum;
            }
            everyWeek.setYear(startCal.get(Calendar.YEAR));
            everyWeek.setWeekBegin(sdf.format(startCal.getTime()));
            startCal.add(Calendar.DATE, 6);
            everyWeek.setWeekEnd(sdf.format(startCal.getTime()));
            everyWeek.setWeekNum(WeekNumStr);
            startCal.add(Calendar.DATE, 1);
            WeekList.add(everyWeek);
        }
        Iterator<Week> iter = WeekList.iterator();
        System.out.println("开始打印");
        while (iter.hasNext()) {
            Week everyweek = iter.next();
            System.out.println(everyweek.getYear() + "年第" + everyweek.getWeekNum() + "周\t" + "开始时间:" + everyweek.getWeekBegin() + "\t结束时间" + everyweek.getWeekEnd());
        }
        return WeekList;
    }

    public static void main(String[] args) {
        String start = "2015-12-12";
        String end = "2016-02-01";
        try {
            Date startDate = sdf.parse(start);
            Date endDate = sdf.parse(end);
            getWeekSplit(startDate, endDate);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

class Week {

    String weekNum;
    int year;
    String weekBegin;
    String weekEnd;

    public String getWeekNum() {
        return weekNum;
    }

    public void setWeekNum(String weekNum) {
        this.weekNum = weekNum;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public String getWeekBegin() {
        return weekBegin;
    }

    public void setWeekBegin(String weekBegin) {
        this.weekBegin = weekBegin;
    }

    public String getWeekEnd() {
        return weekEnd;
    }

    public void setWeekEnd(String weekEnd) {
        this.weekEnd = weekEnd;
    }
}


执行结果如下:



### 计算或表示一周中的第几天 在编程中,通常可以通过日期库或者简单的算法来计算某一天是一周中的第几天。大多数现代编程语言都提供了内置函数或方法用于处理日期和时间。 #### 使用 Python 的 `datetime` 库 Python 提供了一个强大的模块 `datetime` 来处理日期和时间操作。可以利用该模块轻松获取给定日期对应的一周中的第几天(范围为 0 到 6)。其中,星期一被定义为每的第一天(即索引为 0),而星期日则为最后一天(索引为 6)[^3]。 以下是实现此功能的一个简单代码示例: ```python from datetime import datetime def get_weekday(date_string): date_object = datetime.strptime(date_string, "%Y-%m-%d") # 将字符串转换成日期对象 return date_object.weekday() # 返回一周中的第几天,一为0,日为6 # 测试例子 date_input = "2023-10-05" weekday_index = get_weekday(date_input) print(f"The day {date_input} is the {weekday_index}th day of the week.") ``` 如果需要调整起始日(比如让日作为第一天),可以在返回的结果上加一并取模7即可完成自定义设置[^4]。 #### C++ 中的时间处理方式 对于C++而言,标准库 `<ctime>` 和较新的 `<chrono>` 都能帮助我们解决这个问题。下面展示的是基于传统 `<ctime>` 方法的例子: ```cpp #include <iostream> #include <ctime> int main(){ struct tm timeinfo; strptime("2023-10-05", "%Y-%m-%d", &timeinfo); // 解析输入日期到tm结构体 int wday = (mktime(&timeinfo)/86400 + 4)%7; // 转换为秒数再除以每天的总秒数得到偏移量 std::cout << "The given date corresponds to weekday index: "<<wday<<std::endl; } ``` 注意这里的逻辑可能因具体环境有所不同,上述代码片段仅作示意用途[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值