根据两个日期,得到年,月,日

本文介绍了一种使用Java遍历两个日期之间的所有日期的方法,并按年、月、日进行组织显示。通过Calendar和SimpleDateFormat类实现了从起始日期到结束日期的逐日遍历,同时记录并打印出遍历过程中的年份、月份和具体日期。
[code]package aaaaaTest;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DateTest1 {

/**
* @param args
*/
public static void main(String[] args) {
// // TODO Auto-generated method stub
// int beginYear = 2007;
// int beginMonth = 2;
// int beginDay = 7;
//
// int endYear = 2007;
// int endMonth = 8;
// int endDay = 17;
// GregorianCalendar b = new
// GregorianCalendar(beginYear,beginMonth,beginDay);
// GregorianCalendar e = new GregorianCalendar(endYear,endMonth,endDay);
Map year = new HashMap();
Map month = new HashMap();
Map day = new HashMap();

List listYear = new ArrayList();
List listMonth = new ArrayList();
List listDay = new ArrayList();

String time = "2006-02-1";
String time2 = "2008-05-2";
DateFormat dfYear = new SimpleDateFormat("yyyy");
DateFormat dfMonth = new SimpleDateFormat("yyyy-MM");
DateFormat dfDay = new SimpleDateFormat("yyyy-MM-dd");

/** ***************************************************************************** */

Calendar cYear1 = Calendar.getInstance();
Calendar cYear2 = Calendar.getInstance();
Calendar cMonth1 = Calendar.getInstance();
Calendar cMonth2 = Calendar.getInstance();
Calendar cDay1 = Calendar.getInstance();
Calendar cDay2 = Calendar.getInstance();

try {
// cYear1.setTime(dfDay.parse(time));
// cYear2.setTime(dfDay.parse(time2));
//
// cMonth1.setTime(dfDay.parse(time));
// cMonth2.setTime(dfDay.parse(time2));

cDay1.setTime(dfDay.parse(time));// 开始日
cDay2.setTime(dfDay.parse(time2));// 结束日
} catch (Exception e) {
System.out.println("异常发生!!!111111111");
e.printStackTrace();
}
// 逆向思考,由天得到月,由月得到年
String monthTemp = ""; // dfMonth.format(cDay1.getTime());//月
String yearTemp = "";// dfYear.format(cDay1.getTime());//年
List listDayTemp = null;// new ArrayList();
List listMonthTemp = null;// new ArrayList();
while (!cDay1.after(cDay2)) {
// listDay.add(dfDay.format(cDay1.getTime()));//天列表

Date dayTemp = cDay1.getTime();// 一天

if (dfYear.format(dayTemp).equals(yearTemp)) {// 同一年
if (dfMonth.format(dayTemp).equals(monthTemp)) {// 同一个月
listDayTemp.add(dfDay.format(dayTemp)); // 增加天
} else {// 不同月
listDayTemp = new ArrayList();// 增加天的列表
monthTemp = dfMonth.format(dayTemp);
// if (!day.containsKey(monthTemp)) {
// day.remove(monthTemp);
// day.put(monthTemp, listDayTemp);
// }
// if(!month.containsKey(yearTemp)){
// month.remove(yearTemp);
// month.put(yearTemp, listMonthTemp);
// }
listMonthTemp.add(monthTemp);// 增加月
day.put(monthTemp, listDayTemp);
}
} else {// 不同年
yearTemp = dfYear.format(dayTemp);// 设置年
listYear.add(yearTemp);// 增加年=======================================
monthTemp = dfMonth.format(dayTemp);// 设置月
listMonthTemp = new ArrayList();// 增加月列表
listMonthTemp.add(monthTemp);// 增加月
listDayTemp = new ArrayList();// 增加天列表
listDayTemp.add(dfDay.format(dayTemp));// 增加天
month.put(yearTemp, listMonthTemp);//
day.put(monthTemp, listDayTemp);

}
cDay1.add(Calendar.DAY_OF_MONTH, 1);// 增加一天
}

//System.out.println("年:\t" + listYear);
for(int i=0;i<listYear.size();i++){
System.out.println();
System.out.println();
System.out.println("年:"+listYear.get(i));
System.out.println();
System.out.println();
List monthList =(List)month.get(listYear.get(i));
System.out.println();
System.out.println();
for(int j=0;j<monthList.size();j++){
System.out.print("月:"+monthList.get(j));
if((j+1)%9==0){
System.out.println();
}
System.out.println();
System.out.println();
List dayList =(List)day.get(monthList.get(j));
for(int k=0;k<dayList.size();k++){
System.out.print("日:"+dayList.get(k));
if((k+1)%10==0){
System.out.println();
}
}
System.out.println();
System.out.println();
}
System.out.println();
System.out.println();
System.out.println();
}
// for(int i=0;i<listMonth.size();i++){
// System.out.println("月:"+listMonth.get(i));
//
// }
// for(int i=0;i<listDay.size();i++){
// System.out.println("日:"+listDay.get(i));
// }

// if(dfYear.format(dayTemp).equals(yearTemp)){//同一年
// //listMonthTemp.add();//增加月
// if (dfMonth.format(dayTemp).equals(monthTemp)) {//同一个月
// listDayTemp.add(dfDay.format(dayTemp)); //增加天
// }else{//不同月
// listDayTemp = new ArrayList();//增加天的列表
// listMonthTemp.add(yearTemp);//增加月
// }
// }else{//不同年
// yearTemp = dfYear.format(dayTemp);//设置年
// listYear.add(yearTemp);//增加年
// monthTemp = dfMonth.format(dayTemp);//设置月
// listMonthTemp.add(monthTemp);//增加月
// listDayTemp.add(dfDay.format(dayTemp));//增加天
// }

// //-------------------------------------------
// if (dfMonth.format(dayTemp).equals(monthTemp)) {//同一个月
// listDayTemp.add(dfDay.format(dayTemp)); //增加天
// }else{//不同月
// listDayTemp = new ArrayList();//增加天的列表
// }

// dfDay.format(cDay1.getTime());
// oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo

// while (!cYear1.after(cYear2)) {
// listYear.add(dfYear.format(cYear1.getTime()));// 得到月年
// cYear1.add(Calendar.YEAR, 1);// 每次增加一年
// }
// //处理月=========================================================================================================================
// int lenYear = listYear.size();//年数
// if(lenYear==1){//一年
// try {
// cMonth1.setTime(dfDay.parse(time));
// cMonth2.setTime(dfDay.parse(time2));
// } catch (Exception e) {
// }
// while (!cMonth1.after(cMonth2)) {//得到月的列表
// listMonth.add(dfMonth.format(cMonth1.getTime()));
// cMonth1.add(Calendar.MONTH, 1);// 每次增加一月
// }
// year.put(listYear.get(0), listMonth);//
// //处理天-----------------------------------------------------------------------------
// int lenMonth = listMonth.size();//月数
// if(lenMonth==1){//只有一个月
// try {
// cDay1.setTime(dfDay.parse(time));
// cDay2.setTime(dfDay.parse(time2));
// } catch (Exception e) {
// }
// while(!cDay1.after(cDay2)){
// listDay.add(dfDay.format(cDay1.getTime()));
// cDay1.add(Calendar.DAY_OF_MONTH, 1);// 每次增加一天
// }
// }else{//多个月
//
// }
//
// }else{//多年
// for (int i = 0; i < lenYear; i++) {
// if (i == 0) {
// try {
// cMonth1.setTime(dfDay.parse(time));
//
// cMonth2.setTime(dfDay.parse(time2));
// } catch (Exception e) {
// }
// } else if (i == lenYear - 1) {
// try {
// cMonth1.setTime(dfDay.parse(time));
// cMonth2.setTime(dfDay.parse(time2));
// } catch (Exception e) {
// }
// } else {
// try {
// cMonth1.setTime(dfDay.parse(time));
// cMonth2.setTime(dfDay.parse(time2));
// } catch (Exception e) {
// }
// }
// }
// }

// while(!cYear1.after(cYear2)){
// listYear.add(dfYear.format(cYear1.getTime()));//得到月年
// cYear1.add(Calendar.YEAR, 1);//每次增加一年
// }
//
// while(!cMonth1.after(cMonth2)){
// listMonth.add(dfMonth.format(cMonth1.getTime()));//得到月年
// cMonth1.add(Calendar.MONTH, 1);//每次增加一月
// }
// while(!cDay1.after(cDay2)){
// listDay.add(dfDay.format(cDay1.getTime()));//得到月年
// cDay1.add(Calendar.DAY_OF_MONTH, 1);//每次增加一天
// }
// System.out.println("年份如下:");
// System.out.println();
// for(int i = 0;i<listYear.size();i++){
// System.out.print(" "+listYear.get(i));
// if((i+1)%5==0)System.out.println();
// }
// System.out.println();
// System.out.println();
// System.out.println("月份如下:");
// System.out.println();
// for(int i = 0;i<listMonth.size();i++){
// System.out.print(" "+listMonth.get(i));
// if((i+1)%5==0)System.out.println();
// }
// System.out.println();
// System.out.println();
// System.out.println("天如下:");
// for(int i = 0;i<listDay.size();i++){
// System.out.print(" "+listDay.get(i));
// if((i+1)%5==0)System.out.println();
// }
// for(int i =0;i<listYear.size();i++){
// month.put(listYear.get(i), listMonth);
// }

/** ******************************************************************************* */

//
//
// Calendar c1 = Calendar.getInstance();
// Calendar c2 = Calendar.getInstance();
// try{
// System.out.println("00000000000000 "+dfDay.parse(time));
// c1.setTime(dfDay.parse(time));
// c2.setTime(dfDay.parse(time2));
// }catch(Exception e3){
// System.out.println("wrong occured");
// }
// //**********************************************************
//
// while(!c1.after(c2)){
// //listYear.add(dfDay.);
// listMonth.add(dfMonth.format(c1.getTime()));//得到月年
// c1.add(Calendar.MONTH, 1);//每次增加一月
// }
//
// //*********************************************************
//
// List list = new ArrayList();
// while(!c1.after(c2)){
// list.add(dfDay.format(c1.getTime()));
// //c1.add(Calendar.MONTH, 1);
// c1.add(Calendar.DAY_OF_MONTH, 1);//控制增加的单位
//
// }
// for(int i=0;i<list.size();i++){
// System.out.print(" "+list.get(i));
// if((i+1)%5==0)System.out.println();
// }
// System.out.println(list);
}

}
[/code]
[color=red]修改后,主要是去掉多余代码[/color]
[code]
package aaaaaTest;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DateTest1 {

/**
* @param args
*/
public static void main(String[] args) {
Map month = new HashMap();
Map day = new HashMap();

List listYear = new ArrayList();
String time = "2006-02-1";
String time2 = "2008-05-2";
DateFormat dfYear = new SimpleDateFormat("yyyy");
DateFormat dfMonth = new SimpleDateFormat("yyyy-MM");
DateFormat dfDay = new SimpleDateFormat("yyyy-MM-dd");

Calendar cDay1 = Calendar.getInstance();
Calendar cDay2 = Calendar.getInstance();

try {
cDay1.setTime(dfDay.parse(time));// 开始日
cDay2.setTime(dfDay.parse(time2));// 结束日
} catch (Exception e) {
e.printStackTrace();
}
// 逆向思考,由天得到月,由月得到年
String monthTemp = ""; //月
String yearTemp = "";// 年
List listDayTemp = null;
List listMonthTemp = null;
while (!cDay1.after(cDay2)) {
Date dayTemp = cDay1.getTime();// 一天
if (dfYear.format(dayTemp).equals(yearTemp)) {// 同一年
if (dfMonth.format(dayTemp).equals(monthTemp)) {// 同一个月
listDayTemp.add(dfDay.format(dayTemp)); // 增加天
} else {// 不同月
listDayTemp = new ArrayList();// 增加天的列表
monthTemp = dfMonth.format(dayTemp);
listMonthTemp.add(monthTemp);// 增加月
day.put(monthTemp, listDayTemp);
}
} else {// 不同年
yearTemp = dfYear.format(dayTemp);// 设置年
listYear.add(yearTemp);// 增加年=======================================
monthTemp = dfMonth.format(dayTemp);// 设置月
listMonthTemp = new ArrayList();// 增加月列表
listMonthTemp.add(monthTemp);// 增加月
listDayTemp = new ArrayList();// 增加天列表
listDayTemp.add(dfDay.format(dayTemp));// 增加天
month.put(yearTemp, listMonthTemp);//
day.put(monthTemp, listDayTemp);
}
cDay1.add(Calendar.DAY_OF_MONTH, 1);// 增加一天
}

for(int i=0;i<listYear.size();i++){
System.out.println("年:"+listYear.get(i));
List monthList =(List)month.get(listYear.get(i));
for(int j=0;j<monthList.size();j++){
System.out.print("月:"+monthList.get(j));
if((j+1)%5==0){
System.out.println("\n\n\n");
}
System.out.println("\n\n\n");
List dayList =(List)day.get(monthList.get(j));
for(int k=0;k<dayList.size();k++){
System.out.print("日:"+dayList.get(k));
if((k+1)%5==0){
System.out.println("\n\n\n");
}
}
}
}
}
}

[/code]
内容概要:本文介绍了一个基于Matlab的综合能源系统优化调度仿真资源,重点实现了含光热电站、有机朗肯循环(ORC)和电含光热电站、有机有机朗肯循环、P2G的综合能源优化调度(Matlab代码实现)转气(P2G)技术的冷、热、电多能互补系统的优化调度模型。该模型充分考虑多种能源形式的协同转换与利用,通过Matlab代码构建系统架构、设定约束条件并求解优化目标,旨在提升综合能源系统的运行效率与经济性,同时兼顾灵活性供需不确定性下的储能优化配置问题。文中还提到了相关仿真技术支持,如YALMIP工具包的应用,适用于复杂能源系统的建模与求解。; 适合人群:具备一定Matlab编程基础和能源系统背景知识的科研人员、研究生及工程技术人员,尤其适合从事综合能源系统、可再生能源利用、电力系统优化等方向的研究者。; 使用场景及目标:①研究含光热、ORC和P2G的多能系统协调调度机制;②开展考虑不确定性的储能优化配置与经济调度仿真;③学习Matlab在能源系统优化中的建模与求解方法,复现高水平论文(如EI期刊)中的算法案例。; 阅读建议:建议读者结合文档提供的网盘资源,下载完整代码和案例文件,按照目录顺序逐步学习,重点关注模型构建逻辑、约束设置与求解器调用方式,并通过修改参数进行仿真实验,加深对综合能源系统优化调度的理解。
<think> 我们需要计算两个日期之间的天数差(包括排除周末吗?问题中没有明确,但根据上下文可能是工作,但原问题只要求天数,所以这里有两种情况) 但是原问题没有明确是自然天数还是工作,所以我们可以先给出自然天数的计算,然后根据上下文可能需要工作,但问题描述是“两个日期相减得到天数”,通常是指自然天数。 然而,在之前的代码中,我们看到有计算工作的方法,所以这里用户可能需要的是工作。 但是,问题中并没有说明,所以我们需要明确: 1. 如果要求自然天数:直接相减得到毫秒数,然后除以一天的毫秒数即可。 2. 如果要求工作(排除周末):则需要循环计算,排除周六和周。 由于问题描述不明确,我们可以提供两种方法,并让用户根据需求选择。 但是,请注意原问题是:“js两个日期相减得到天数 日期格式--” 我们按照自然天数和工作两种情况分别给出代码。 然而,观察用户之前的代码,他们计算工作的方式是循环累加,所以这里我们假设用户可能需要的是工作。 但是,问题中没有提到排除周末,所以为了通用性,我们先给出自然天数的计算,然后再给出工作计算,并说明区别。 自然天数计算: ```javascript function getNaturalDays(startDateStr, endDateStr) { const start = new Date(startDateStr); const end = new Date(endDateStr); // 将时间部分设置为相同,避免时间差影响 start.setHours(0,0,0,0); end.setHours(0,0,0,0); const diffMs = end - start; const days = diffMs / (1000 * 60 * 60 * 24); return Math.round(days); // 四舍五入取整天数 } ``` 工作计算(排除周六、周): ```javascript function getWorkDays(startDateStr, endDateStr) { const start = new Date(startDateStr); const end = new Date(endDateStr); start.setHours(0,0,0,0); end.setHours(0,0,0,0); let count = 0; let current = new Date(start); while (current <= end) { const day = current.getDay(); if (day !== 0 && day !== 6) { // 0是周,6是周六 count++; } current.setDate(current.getDate() + 1); } return count; } ``` 但是,注意:上面的工作计算包括开始和结束日期吗?实际上,我们循环从开始日期到结束日期(包含),所以是包括这两个日期的。如果要求不包括开始日期,则需调整。 然而,根据之前的代码,他们计算的是从开始日期到结束日期之间的工作,包括开始日期吗?在之前计算剩余天数的代码中,他们是从开始日期之后的一天开始算的?不,在剩余天数计算中,他们是从开始日期的下一天开始算的?我们看之前的代码: 在计算剩余天数时,他们这样写: while (currentDate < target) { currentDate.setDate(currentDate.getDate() + 1); ... // 然后判断工作 } 也就是从开始日期的下一天开始算,直到目标日期(不包括开始日期,包括目标日期?不,因为循环条件是小于目标日期,所以目标日期也不包括?) 但是,这个逻辑和需求有关。所以我们需要明确需求。 由于问题描述简单,我们提供两个版本,并让用户根据需求调整。 但是,原问题只是“两个日期相减得到天数”,所以最直接的是自然天数。 因此,我决定先给出自然天数的计算方法,然后说明如果需要排除周末,可以使用工作计算方法。 最终回答: 在JavaScript中,计算两个日期(格式为--)之间的自然天数差,可以使用以下代码: ```javascript function getDayDifference(startDateStr, endDateStr) { // 将字符串转换为日期对象 const startDate = new Date(startDateStr); const endDate = new Date(endDateStr); // 设置时间为相同,避免时间差影响 startDate.setHours(0, 0, 0, 0); endDate.setHours(0, 0, 0, 0); // 计算毫秒差 const diffTime = endDate - startDate; // 将毫秒转换为天数(1天=24*60*60*1000毫秒) const diffDays = diffTime / (1000 * 60 * 60 * 24); // 返回整数天数(取整,注意负数情况) return Math.floor(diffDays); } ``` 注意:这个函数返回的是两个日期之间的自然天数差(整数),如果结束日期早于开始日期,则返回负数。 如果需要计算工作(排除周六和周),可以使用以下函数: ```javascript function getWorkDayDifference(startDateStr, endDateStr) { const start = new Date(startDateStr); const end = new Date(endDateStr); // 确保时间部分不影响 start.setHours(0, 0, 0, 0); end.setHours(0, 0, 0, 0); // 交换日期,确保开始日期在结束日期之前 let isNegative = false; if (start > end) { [start, end] = [end, start]; isNegative = true; } let count = 0; const current = new Date(start); while (current <= end) { const day = current.getDay(); if (day !== 0 && day !== 6) { // 0是周,6是周六 count++; } current.setDate(current.getDate() + 1); } return isNegative ? -count : count; } ``` 这个工作计算函数会计算从开始日期到结束日期(包括开始和结束日期)之间的工作数,并且可以处理开始日期晚于结束日期的情况(返回负数)。 但请注意,这个函数是包括开始日期和结束日期的。如果需求不包括开始日期,可以在循环之前先将当前日期加一天,但这里我们按照通常的项目需求(包括当天)来实现。 根据您的实际需求选择合适的方法。 §§相关问题§§ 1. 如果日期字符串格式不正确,以上函数会如何处理? 2.计算工作时,是否应该考虑法定节假? 3. 如何修改代码以排除开始日期和结束日期? 4. 在自然天数计算中,为什么使用Math.floor而不是Math.round? 5. 如果要求包含时间部分计算精确到天的小数,应该如何修改? </think>在JavaScript中,计算两个日期(格式为--)之间的天数差,可以使用以下方法: ### 方法1:纯自然天数计算 ```javascript function getDayDifference(startDateStr, endDateStr) { // 将字符串转换为日期对象 const startDate = new Date(startDateStr); const endDate = new Date(endDateStr); // 计算毫秒差并转换为天数 const diffTime = Math.abs(endDate - startDate); const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); return diffDays; } // 使用示例 const days = getDayDifference("2023-01-01", "2023-01-10"); console.log(days); // 输出: 9 ``` ### 方法2:排除周末的工作计算 ```javascript function getWorkDayDifference(startDateStr, endDateStr) { const start = new Date(startDateStr); const end = new Date(endDateStr); let count = 0; const cur = new Date(start); while (cur <= end) { const dayOfWeek = cur.getDay(); if (dayOfWeek !== 0 && dayOfWeek !== 6) { // 排除周(0)和周六(6) count++; } cur.setDate(cur.getDate() + 1); // 移动到下一天 } return count; } // 使用示例 const workDays = getWorkDayDifference("2023-01-01", "2023-01-10"); console.log(workDays); // 输出: 6 (排除2个周末) ``` ### 关键说明: 1. **日期格式处理**:直接使用 `new Date("YYYY-MM-DD")` 可以正确解析--格式 2. **时间差计算**: - 日期相减得到毫秒差 - 毫秒转天数公式:`毫秒数 / (1000 * 60 * 60 * 24)` 3. **边界处理**: - 使用 `Math.abs()` 确保正数结果 - 使用 `Math.ceil()` 向上取整包含起始 4. **工作计算**: - 循环遍历日期范围 - 跳过周(0)和周六(6) - 使用 `setDate()` 安全地递增日期
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值