日期处理-问题 E: 日期累加

题目描述
设计一个程序能计算一个日期加上若干天后是什么日期。

输入
输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。

输出
输出m行,每行按yyyy-mm-dd的个数输出。

样例输入
1
2008 2 3 100

样例输出
2008-05-13

AC代码:

#include<cstdio>

//平年和闰年每月的天数
const int Mon[13][2] = {
{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},
	  {31,31},{31,31},{30,30},{31,31},{30,30},{31,31}
};

//判断平年还是闰年
int isLeap(int year) {
	return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

int main()
{
	//用于输入
	int year, mon, day, days;
    int n;
    scanf("%d", &n); 
	while (n--) {
         
        scanf("%d %d %d %d", &year, &mon, &day, &days);
		
		while(days--){
			day++;
			if(day == Mon[mon][isLeap(year)] + 1){
				day = 1;
				mon++;
			}
			if(mon == 13){
				mon = 1;
				year++; 
			}
		}
		//%0md指不足m位用0补齐
		printf("%04d-%02d-%02d\n", year, mon, day);
	}
	return 0;
}

收获:
1.在告诉你具体日期问你经过多少天后的日期,直接从这天往后加
在加的过程中调正日月年即可
2.而只告诉你年和天数,这就需要天数循环减去当月天数,
直到天数小于当月天数,这时的数值就等于day,而year和mon
还是在循环中累加
区别:这两种情况在于计算day的不同,前者是知道具体日期
只需在加的过程中调整,后者不知道具体日期就用减的方式
从前往后逼近

第二种情况的题目链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以按照如下步骤实现: 1. 将工作时段字符串分割成多个时间段,每个时间段存储为一个包含开始时间和结束时间的数组。 2. 遍历每个时间段,判断指定日期是否在该时间段内。若在,则计算该时间段内工作了多少分钟,并累加到总工作分钟数中。 3. 返回总工作分钟数。 以下是一个可能的实现方式: ```java import java.text.SimpleDateFormat; import java.util.Date; public class DeviceWorkTimeCalculator { // 时间段分隔符 private static final String TIME_RANGE_SEPARATOR = ";"; // 时间格式 private static final SimpleDateFormat TIME_FORMAT = new SimpleDateFormat("HH:mm"); /** * 计算指定日期在设备工作时段内的工作分钟数 * * @param workTimeStr 设备工作时段字符串,格式为"HH:mm-HH:mm;HH:mm-HH:mm;HH:mm-HH:mm" * @param workStartTime 设备工作开始日期时间 * @param workEndTime 设备工作结束日期时间 * @param targetDate 指定日期 * @return 工作分钟数 */ public static int calculateWorkMinutes(String workTimeStr, Date workStartTime, Date workEndTime, Date targetDate) { int workMinutes = 0; // 将工作时段字符串分割成多个时间段 String[] timeRanges = workTimeStr.split(TIME_RANGE_SEPARATOR); for (String timeRange : timeRanges) { // 解析开始时间和结束时间 String[] split = timeRange.split("-"); Date startTime = parseTime(split[0]); Date endTime = parseTime(split[1]); // 计算指定日期在该时间段内的工作分钟数 if (isDateInRange(targetDate, workStartTime, workEndTime) && isTimeInRange(targetDate, startTime, endTime)) { workMinutes += calculateMinutesBetween(targetDate, startTime, endTime); } } return workMinutes; } /** * 解析时间字符串为Date对象 * * @param timeStr 时间字符串,格式为"HH:mm" * @return Date对象 */ private static Date parseTime(String timeStr) { try { return TIME_FORMAT.parse(timeStr); } catch (Exception e) { throw new IllegalArgumentException("Invalid time string: " + timeStr); } } /** * 判断指定日期是否在工作日期范围内 * * @param date 指定日期 * @param workStartTime 工作开始日期时间 * @param workEndTime 工作结束日期时间 * @return true表示在范围内,false表示不在范围内 */ private static boolean isDateInRange(Date date, Date workStartTime, Date workEndTime) { return date.compareTo(workStartTime) >= 0 && date.compareTo(workEndTime) <= 0; } /** * 判断指定时间是否在时间段内 * * @param date 指定日期 * @param startTime 时间段开始时间 * @param endTime 时间段结束时间 * @return true表示在时间段内,false表示不在时间段内 */ private static boolean isTimeInRange(Date date, Date startTime, Date endTime) { return date.getTime() - startTime.getTime() >= 0 && endTime.getTime() - date.getTime() >= 0; } /** * 计算指定日期在时间段内的工作分钟数 * * @param date 指定日期 * @param startTime 时间段开始时间 * @param endTime 时间段结束时间 * @return 工作分钟数 */ private static int calculateMinutesBetween(Date date, Date startTime, Date endTime) { long startMillis = startTime.getTime(); long endMillis = endTime.getTime(); long targetMillis = date.getTime(); // 如果指定日期在开始时间之前,则以开始时间为准 if (targetMillis < startMillis) { targetMillis = startMillis; } // 如果指定日期在结束时间之后,则以结束时间为准 if (targetMillis > endMillis) { targetMillis = endMillis; } // 计算工作分钟数 return (int) ((targetMillis - startMillis) / 1000 / 60); } } ``` 使用示例: ```java // 设备工作时段字符串 String workTimeStr = "08:00-12:00;13:00-17:00;19:00-22:00"; // 设备工作开始时间和结束时间 Date workStartTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2021-07-01 08:00:00"); Date workEndTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2021-07-31 22:00:00"); // 指定日期 Date targetDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2021-07-06 10:30:00"); // 计算工作分钟数 int workMinutes = DeviceWorkTimeCalculator.calculateWorkMinutes(workTimeStr, workStartTime, workEndTime, targetDate); System.out.println("工作分钟数:" + workMinutes); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值