javascript跨年跨月日期解析

/*
@author seave
@sincee 2006-03-24
*根据输入的一天,日期格式为yyyy-mm-dd,得到本周开始时间,和本周结束时间,
本周的界定为:星期日、星期一、...、星期六,即星期日为本周的第一天,星期六为本周的最后一天
本周的开始时间为:星期一
本周的结束时间为:星期五
*/
function getDateInfo(dataInfo)
{
 //获取选择的时间,日期格式为yyyy-mm-dd
 var dataInfo = window.document.forms[0].selectDate.value;
 if(dataInfo == '')
 {
  alert("请先选择日期!");
  return;
 }
 
 //解析输入的时间
 var year = dataInfo.substring(0,4);
 var month;
 var day = dataInfo.substring(8,10);
 
 if(dataInfo.substring(5,6) == 0)
 {
  month = dataInfo.substring(6,7);
 }
 else
 {
  month = dataInfo.substring(5,7);
 }
 
 //创建日期对象
 var date = new Date(year,month-1,day);
 
 var weekYear = date.getFullYear();
 var weekMonth = date.getMonth() + 1;
 
 //获取当前月的总天数
 var nowTotalDays =  parseDays(weekYear,weekMonth);
 
 var beginWeekDay;
 var endWeekDay;
 var beginWeekDate;
 var endWeekDate
 
 //开始和结束时间可能跨月,开始时间跨前一月,结束时间靠后一月
 
 //组织本周开始时间
 if((date.getDate() - date.getDay()) < 0) 
 {
  //开始时间跨前一月
  var tempCount = date.getDay() - date.getDate();
 
  //获取上月的总天数
  var lastMonth = weekMonth-1;
  var lastTotalDays;
 
  if(lastMonth == 0)
  {
   //开始时间跨上一年
   var lastYear = weekYear -1;
   var lastYearMonth = 12;
   lastTotalDays = parseDays(lastYear,lastYearMonth-1);
  
   beginWeekDay = lastTotalDays - (date.getDay() - date.getDate()) + 1;
   beginWeekDate = lastYear + "-" + parseFormatTwo(lastYearMonth) + "-" + parseFormatTwo(beginWeekDay); 
  }
  else
  {
   //开始时间没有跨年
   lastTotalDays = parseDays(weekYear,lastMonth-1);
   beginWeekDay = lastTotalDays - (date.getDay() - date.getDate()) + 1;
   beginWeekDate = weekYear + "-" + parseFormatTwo(lastMonth) + "-" + parseFormatTwo(beginWeekDay);
  }
 }
 else if((date.getDay() == 0) && (date.getDate() == parseDays(weekYear,weekMonth-1)))
 {
  //开始时间跨下一月
  //当月的最后一日为星期天
  beginWeekDay = 1;
  var nextMonth = weekMonth + 1;
  if(nextMonth == 13)
  {
   //开始时间跨下一年
   var nextYear = weekYear + 1;
   var nextYearMonth = 1;
  
   beginWeekDate = nextYear + "-" + parseFormatTwo(nextYearMonth) + "-" + parseFormatTwo(beginWeekDay);
  }
  else
  {
   beginWeekDate = weekYear + "-" + parseFormatTwo(nextMonth) + "-" + parseFormatTwo(beginWeekDay);
  }
 }
 else
 {
  beginWeekDay = date.getDate() - date.getDay() + 1;
  beginWeekDate = weekYear + "-" + parseFormatTwo(weekMonth) + "-" + parseFormatTwo(beginWeekDay);
 }

 //组织本周结束时间
 if((date.getDate() - date.getDay() + 5) == 0)
 {
  //结束时间跨上一月
  //当月的第一日为星期六的情况
  var lastMonth = weekMonth-1;
  var lastTotalDays;
 
  if(lastMonth == 0)
  {
   //结束时间跨上一年
   var lastYear = weekYear -1;
   var lastYearMonth = 12;
   //lastTotalDays = parseDays(lastYear,lastYearMonth-1);
  
   endWeekDay = parseDays(lastYear,lastYearMonth-1);;
   endWeekDate = lastYear + "-" + parseFormatTwo(lastYearMonth) + "-" + parseFormatTwo(endWeekDay);
  }
  else
  {
   //lastTotalDays = parseDays(weekYear,lastMonth-1);  
   //结束时间未跨年
   endWeekDay = parseDays(weekYear,lastMonth-1);
   endWeekDate = weekYear + "-" + parseFormatTwo(lastMonth) + "-" + parseFormatTwo(endWeekDay);
  }
 }
 else if(((date.getDate() - date.getDay() + 5) - parseDays(weekYear,weekMonth-1)) > 0)
 {
  //结束时间跨下一月
  var nextMonth = weekMonth + 1;
  if(nextMonth == 13)
  {
   //结束时间跨下一年
   var nextYear = weekYear + 1;
   var nextYearMonth = 1;
  
   endWeekDay = (date.getDate() - date.getDay() + 5) - parseDays(weekYear,weekMonth-1);
   endWeekDate = nextYear + "-" + parseFormatTwo(nextYearMonth) + "-" + parseFormatTwo(endWeekDay);  
  }
  else
  {
   //结束时间跨下一个月,但不跨下一年
   endWeekDay = (date.getDate() - date.getDay() + 5) - parseDays(weekYear,weekMonth-1);
   endWeekDate = weekYear + "-" + parseFormatTwo(nextMonth) + "-" + parseFormatTwo(endWeekDay);
  }
 }
 else
 {
  endWeekDay = date.getDate() - date.getDay() + 5
 
  //组织开始时间和结束时间
  endWeekDate = weekYear + "-" + parseFormatTwo(weekMonth) + "-" + parseFormatTwo(endWeekDay);
 }
 
 //提供某年某月某日,返回某年的第几周
 var weekofYear = weekOfYear(weekYear,weekMonth,day);
 
 //组织顺序周数
 //var weeks = weekYear + "" + parseFormatTwo(weekofYear);
 
 window.document.forms[0].begindate.value = beginWeekDate;
 window.document.forms[0].enddate.value = endWeekDate;
 window.document.forms[0].cwweekoder.value = weekofYear;
 window.document.forms[0].selectDate.value = dataInfo;
 //alert("new beginWeekDate = " + beginWeekDate);
 //alert("old endWeekDate = " + endWeekDate);
 
 window.document.forms[0].action = "com.sdpcpa.oa.workstatics.CenWorkActionLet";
 window.document.forms[0].target = "_self";
 window.document.forms[0].method = "GET";
 window.document.forms[0].submit();
 return;
}

//返回国历 y年某m+1月的天数
function parseDays(y,m)
{
  if(m==1)
 {
  //判断是否润年
   return(((y%4 == 0) && (y%100 != 0) || (y%400 == 0))? 29: 28)
 }
  else
 {
  if(m == 3 || m == 5 || m == 8 || m == 10)
  {
   //月小
   return 30;
  }
  else
  {
   //月大
    return 31;
  }
 }
}

/*
格式化时间字符串
月和日不足两位,在前面补0
*/
function parseFormatTwo(str)
{
 if(str != undefined)
 {
  if(str > 9)
  {
   return str;
  }
  else
  {
   return "0"+str;
  }
 }
}

/*
输入年、月、日
根据当前年的1.1判断当前日为第几周
一周的时间范围从,星期日、星期一、星期二、...、星期六
如果当年的最后一个月最后一周,不足七天,则计算到下一年的第一月
*/
function weekOfYear(year, month, day)
{
  var beginDate = new Date(year, 0, 1);
  var endDate = new Date(year, month-1, day);
  var dayMS = 24*60*60*1000; //毫秒
  var firstDay = (6-beginDate.getDay())*dayMS;
  var weekMS = 7*dayMS;
  var beginTime = beginDate.getTime();
  var endTime = endDate.getTime();
  var week = Math.ceil((endTime-beginTime-firstDay)/weekMS)+1;
 
  var endMonth = endDate.getMonth();
  var endDay = endDate.getDate();
  var endWeekDay = (endDate.getDate() - endDate.getDay() + 5) - 31
  if(endMonth == 11 && endWeekDay > 0)
  {
   //当年的最后一个月的最后一周要跨月的情况
   week = 1;
 year = year + 1;
  }
    return year + "" + parseFormatTwo(week);
}

附图: 

解决方案:点选择日期,出现一个时期控件,再点更新,可以根据输入的时间自动计算出周报开始时间和周报的结束时间,以及顺序周数,相应的计算规则见程序头上的说明文档。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值