java 根据时间段获取横跨的周

本文介绍了一段Java代码,该代码用于获取两个指定日期之间的每周开始和结束时间,适用于时间序列数据分析场景。通过解析输入的时间戳,计算出对应日期所在的周数,并获取每周的周一和周日日期,最后返回一系列格式化的日期字符串,表示每一周的时间范围。

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

工具类


public static List<String> getWeekStartAndEnd(String startTimStamp, String endTimStamp) {
		try {
			List<String> datas = new ArrayList<String>();
			
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // 设置时间格式
			Date startTime = sdf.parse(startTimStamp);
			Date endTime = sdf.parse(endTimStamp);
			//开始时间年份
			Calendar cal1 = Calendar.getInstance();
			cal1.setTime(startTime);
			int startYear = cal1.get(Calendar.YEAR);
			//结束时间年份
			Calendar cal2 = Calendar.getInstance();
			cal2.setTime(endTime);
			int endYear = cal2.get(Calendar.YEAR);
			//获取第几周
			int startWeekNo = getWeekOfYear(startTime);
			int endWeekNo = getWeekOfYear(endTime);
			//如果年份相同
			if(startYear == endYear) {
				if(startWeekNo != endWeekNo) {
					while(startWeekNo <= endWeekNo) {
						String startStr = getStartDayOfWeekNo(startYear, startWeekNo);
						String endStr = getEndDayOfWeekNo(startYear, startWeekNo);
						datas.add(getTimeStampPattern2(startStr, endStr));
						startWeekNo++;
					}
				}else {
					String startStr = getStartDayOfWeekNo(startYear, startWeekNo);
					String endStr = getEndDayOfWeekNo(startYear, startWeekNo);
					datas.add(getTimeStampPattern2(startStr, endStr));
				}
				
			}else {
				int startWeekTotal = getMaxWeekNumOfYear(startYear);
				if(startWeekNo != startWeekTotal) {
					while(startWeekNo < startWeekTotal) {
						String startStr = getStartDayOfWeekNo(startYear, startWeekNo);
						String endStr = getEndDayOfWeekNo(startYear, startWeekNo);
						datas.add(getTimeStampPattern2(startStr, endStr));
						startWeekNo++;
					}
				}else {
					String startStr = getStartDayOfWeekNo(startYear, startWeekNo);
					String endStr = getEndDayOfWeekNo(startYear, startWeekNo);
					datas.add(getTimeStampPattern2(startStr, endStr));
				}
				
				if(endWeekNo == startWeekTotal && cal2.get(Calendar.MONTH) == 0) {
				}else {
					int endWeekTotal = 1;
					if(endWeekTotal != endWeekNo) {
						while(endWeekTotal <= endWeekNo) {
							String startStr = getStartDayOfWeekNo(endYear, endWeekTotal);
							String endStr = getEndDayOfWeekNo(endYear, endWeekTotal);
							datas.add(getTimeStampPattern2(startStr, endStr));
							endWeekTotal++;
						}
					}else {
						String startStr = getStartDayOfWeekNo(endYear, endWeekTotal);
						String endStr = getEndDayOfWeekNo(endYear, endWeekTotal);
						datas.add(getTimeStampPattern2(startStr, endStr));
					}
				}
				
				
			}
			
			return datas;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	// 获取当前时间所在年的最大周数
	public static int getMaxWeekNumOfYear(int year) {
		Calendar c = new GregorianCalendar();
		c.set(year, Calendar.DECEMBER, 31, 23, 59, 59);

		return getWeekOfYear(c.getTime());
	}

	// 获取当前时间所在年的周数
	public static int getWeekOfYear(Date date) {
		Calendar c = new GregorianCalendar();
		c.setFirstDayOfWeek(Calendar.MONDAY);
		c.setMinimalDaysInFirstWeek(7);
		c.setTime(date);

		return c.get(Calendar.WEEK_OF_YEAR);
	}

	// 获取这一年的日历
	private static Calendar getCalendarFormYear(int year) {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
		cal.set(Calendar.YEAR, year);
		return cal;
	}

	//获取某一年的某一周的周日日期
	public static String getEndDayOfWeekNo(int year, int weekNo) {
		Calendar cal = getCalendarFormYear(year);
		cal.setFirstDayOfWeek(Calendar.MONDAY);
		cal.setMinimalDaysInFirstWeek(7);
		cal.set(Calendar.WEEK_OF_YEAR, weekNo);
		cal.add(Calendar.DAY_OF_WEEK, 6);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date endDate = cal.getTime();
		String endDateString = sdf.format(endDate);
		return endDateString;
	}

	//获取某一年的某一周的周一日期
	public static String getStartDayOfWeekNo(int year, int weekNo) {
		Calendar cal = getCalendarFormYear(year);
		cal.setFirstDayOfWeek(Calendar.MONDAY);
		cal.setMinimalDaysInFirstWeek(7);
		cal.set(Calendar.WEEK_OF_YEAR, weekNo);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date startDate = cal.getTime();
		String startDateString = sdf.format(startDate);
		return startDateString;

	}
	
	public static String getTimeStampPattern2(String startStr, String endStr){
        return startStr + " ~ " + endStr;
    }

    public static void main(String[] args) {
        getWeekStartAndEnd("2021-01-04", "2021-03-04");
    }

你可以使用 C# 中的 DateTime 和 TimeSpan 类来计算时间段横跨的月份数量。具体步骤如下: 1. 获取时间段的起始日期和结束日期。 2. 使用 TimeSpan 类计算时间段的总天数。 3. 计算起始日期所在月份的第一天,和结束日期所在月份的最后一天。 4. 使用 TimeSpan 类计算起始日期所在月份的天数和结束日期所在月份的天数。 5. 如果时间段起始日期和结束日期在同一月份内,则时间段横跨的月份数量为 1。 6. 否则,计算时间段横跨的完整月份数量。如果起始日期所在月份的第一天早于结束日期所在月份的最后一天,则横跨的月份数量为结束日期所在月份减去起始日期所在月份加 1。 7. 最后,如果起始日期所在月份的天数大于等于结束日期所在月份的天数,则需要减去一月份。 下面是一个示例代码: ```csharp DateTime startDate = new DateTime(2022, 1, 15); DateTime endDate = new DateTime(2022, 4, 20); TimeSpan duration = endDate - startDate; int totalDays = duration.Days; DateTime startMonthFirstDay = new DateTime(startDate.Year, startDate.Month, 1); DateTime endMonthLastDay = new DateTime(endDate.Year, endDate.Month, DateTime.DaysInMonth(endDate.Year, endDate.Month)); int startMonthDays = (startMonthFirstDay.AddMonths(1) - startDate).Days; int endMonthDays = endDate.Subtract(endMonthLastDay).Days + 1; int totalMonths = 0; if (startDate.Month == endDate.Month) { totalMonths = 1; } else { totalMonths = ((endDate.Year - startDate.Year) * 12) + endDate.Month - startDate.Month + 1; if (startMonthFirstDay < endMonthLastDay) { totalMonths--; } if (startMonthDays >= endMonthDays) { totalMonths--; } } Console.WriteLine("时间段横跨的月份数量为:" + totalMonths); ``` 在这个示例代码中,我们假设时间段起始日期为 2022 年 1 月 15 日,结束日期为 2022 年 4 月 20 日。最终输出的结果是时间段横跨的月份数量为 4。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值