fw.date.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. /**
  2. * @author herong
  3. * 日期组件
  4. */
  5. var CFWDate = _FW.fCreateClass();
  6. /**
  7. * 日期组件API
  8. */
  9. CFWDate.prototype = {
  10. /**
  11. * 初始化
  12. * */
  13. fInitialize : function(options) {
  14. },
  15. /**
  16. * 获取应用服务器时间
  17. * 主要是根据传入的日期格式,获取应用服务器当前时间
  18. * @param String sFormate 日期的格式 参见开发手册“获取数据库服务器指定格式的当前日期时间”
  19. * @return String 日期格式传入空时,返回默认格式 yyyy-mm-dd
  20. * <pre>
  21. * 使用举例:
  22. * var _sFormate = "yyyy年mm月dd日 hh时mm分ss秒sss毫秒";
  23. * CFW.oDate.fnGetAppSerDate(_sFormate);
  24. * </pre>
  25. */
  26. fnGetAppSerDate : function (sFormate) {
  27. var str = "";
  28. $.ajax({
  29. url:contextPath + '/jsp/framework/sysdate.jsp'
  30. ,data:{FORMATE:sFormate}
  31. ,cache:false
  32. ,type:'post'
  33. ,async:false
  34. ,error:function (request, textStatus, errorThrown){CFW.oWin.fnAlert("获取系统时间出错!");}
  35. ,success:function (data, textStatus){str = jQuery.trim(data); }
  36. });
  37. return str;
  38. },
  39. /**
  40. * 计算月份指定累加或减少月数后的月份
  41. * @param String sDate (必需) 初始年月 YYYYMM
  42. * @param int iMonths (必需) 增加或减少的数量(增加为正数,减少为负数)
  43. * @return String 格式为YYYYMM
  44. * <pre>
  45. * 使用举例:
  46. * var _aNy = CFW.oDate.fnAddMmonths("201201",2);
  47. * </pre>
  48. */
  49. fnAddMmonths : function (sDate,iMonths) {
  50. if(!CFW.oValid.fnIsNY(sDate)){
  51. return sDate;
  52. }
  53. if(!CFW.oValid.fnIsInteger(iMonths)){
  54. return sDate;
  55. }
  56. var iY = parseInt(sDate.substring(0,4),10);
  57. var iM = parseInt(sDate.substring(4,6),10);
  58. var mdate = new Date(iY, iM - 1, 1);//年月日,月从0开始,因此需减一
  59. var num = parseInt(iMonths+"",10);
  60. //***增减月数
  61. mdate.setMonth(mdate.getMonth() + num);
  62. //如果月份长度少于2,则前加 0 补位
  63. if((mdate.getMonth() + 1).toString().length == 1) {
  64. mth = 0 + "" + (mdate.getMonth() + 1).toString();
  65. } else {
  66. mth = (mdate.getMonth() + 1).toString();
  67. }
  68. var str = mdate.getFullYear() + "" + mth;
  69. return str;
  70. },
  71. /**
  72. * 计算间隔天数后的日期
  73. * @param String sDate (必需) 日期字符串 格式为yyyy-mm-dd
  74. * @param int iDays (必需) 间隔的天数
  75. * @return String 格式为yyyy-mm-dd
  76. * <pre>
  77. * 使用举例:
  78. * var _aDate = CFW.oDate.fnAddDays("2012-01-01",20);
  79. * </pre>
  80. */
  81. fnAddDays : function (sDate,iDays) {
  82. if(!CFW.oValid.fnIsDate(sDate,"yyyy-mm-dd")){
  83. return ;
  84. }
  85. if(!CFW.oValid.fnIsInteger(iDays)){
  86. return ;
  87. }
  88. var dateString;
  89. var arry = sDate.split("-");
  90. var iY = parseInt(arry[0],10);
  91. var iM = parseInt(arry[1],10);
  92. var iD = parseInt(arry[2],10);
  93. var mdate = new Date(iY, iM - 1, iD);
  94. var num = parseInt(iDays,10);
  95. //***增减天数
  96. mdate.setDate(mdate.getDate()+num);
  97. //如果月份长度少于2,则前加 0 补位
  98. if((mdate.getMonth() + 1).toString().length == 1) {
  99. monthString = 0 + "" + (mdate.getMonth() + 1).toString();
  100. } else {
  101. monthString = (mdate.getMonth() + 1).toString();
  102. }
  103. //如果天数长度少于2,则前加 0 补位
  104. if (mdate.getDate().toString().length == 1) {
  105. dayString = 0 + "" + mdate.getDate().toString();
  106. } else {
  107. dayString = mdate.getDate().toString();
  108. }
  109. dateString = mdate.getFullYear() + "-" + monthString + "-" + dayString;
  110. return dateString;
  111. },
  112. /**
  113. * 计算两个年月之间的相差月数
  114. * @param String sDateBegin (必需) 开始年月 字符串 格式为YYYYMM
  115. * @param String sDateEnd (必需) 结束年月 字符串 格式为YYYYMM
  116. * @return int 相差月数
  117. * <pre>
  118. * 使用举例:
  119. * var _aYs = CFW.oDate.fnMonthsBetween("201201","201202");
  120. * </pre>
  121. */
  122. fnMonthsBetween : function (sDateBegin,sDateEnd) {
  123. var strOut;
  124. if(!CFW.oValid.fnIsNY(sDateBegin)){
  125. return 0;
  126. }
  127. if(!CFW.oValid.fnIsNY(sDateEnd)){
  128. return 0;
  129. }
  130. var iB = parseInt(sDateBegin.substring(0,4),10)* 12 + parseInt(sDateBegin.substring(4, 6),10);
  131. var iE = parseInt(sDateEnd.substring(0, 4),10) * 12 + parseInt(sDateEnd.substring(4, 6),10);
  132. strOut = iE - iB;
  133. return strOut;
  134. },
  135. /**
  136. * 计算两个日期间隔的天数
  137. * @param String sBeginDate (必需) 开始日期 字符串 格式 yyyy-mm-dd
  138. * @param String sEndDate (必需) 结束日期 字符串 格式 yyyy-mm-dd
  139. * @return int 间隔天数
  140. * <pre>
  141. * 使用举例:
  142. * var _aDays = CFW.oDate.fnDaysBetween("2012-01-10","2012-01-30");
  143. * </pre>
  144. */
  145. fnDaysBetween : function (sBeginDate,sEndDate) {
  146. if(!CFW.oValid.fnIsDate(sBeginDate,"yyyy-mm-dd")){
  147. return 0;
  148. }
  149. if(!CFW.oValid.fnIsDate(sEndDate,"yyyy-mm-dd")){
  150. return 0;
  151. }
  152. //将两个日期用数组方式转为日期格式
  153. var arryB = sBeginDate.split("-");
  154. var arryE = sEndDate.split("-");
  155. var iY = parseInt(arryB[0],10);
  156. var iM = parseInt(arryB[1],10);
  157. var iD = parseInt(arryB[2],10);
  158. var dateB = new Date(iY, iM - 1, iD);
  159. iY = parseInt(arryE[0],10);
  160. iM = parseInt(arryE[1],10);
  161. iD = parseInt(arryE[2],10);
  162. var dateE = new Date(iY, iM - 1, iD);
  163. //将两个日期想减得差值
  164. var iDay = (dateE - dateB )/(1000*60*60*24);
  165. return iDay;
  166. },
  167. /**
  168. * 日期格式转换
  169. * 主要是将传入的日期字符串,从当前的日期格式转换成新的日期格式
  170. * @param String sDateStr (必需) 日期字符串
  171. * @param String sCurFormat (必需) 当前的日期格式(日期的格式支持 yyyymmdd、yyyy-mm-dd、yyyy/mm/dd)
  172. * @param String sNewFormat (必需) 转换后的日期格式(日期的格式支持 yyyymmdd、yyyy-mm-dd、yyyy/mm/dd)
  173. * @return String 转换后的日期字符串
  174. * <pre>
  175. * 使用举例:
  176. * var _aDate = CFW.oDate.fnFormateDateStr("20120110","YYYYMMDD","YYYY-MM-DD");
  177. * </pre>
  178. */
  179. fnFormateDateStr : function (sDateStr,sCurFormat,sNewFormat) {
  180. var sYear ="";
  181. var sMm ="";
  182. var sDd ="";
  183. var sDate="";
  184. if(sCurFormat.toLowerCase().match(/yyyy[-\/]?mm[-\/]?dd/)==null)
  185. {
  186. CFW.oWin.fnAlert(sCurFormat+' 原格式不正确!');
  187. return "";
  188. }
  189. if(sNewFormat.toLowerCase().match(/yyyy[-\/]?mm[-\/]?dd/)==null)
  190. {
  191. CFW.oWin.fnAlert(sNewFormat+' 替换格式不正确!');
  192. return "";
  193. }
  194. if(sDateStr.match(/\d{4}[-\/]?\d{2}[-\/]?\d{2}/)==null)
  195. {
  196. CFW.oWin.fnAlert(sDateStr+' 录入日期字符串与其格式不匹配!');
  197. return "";
  198. }
  199. var ft_1 = sCurFormat.toLowerCase();
  200. var ft_2 = sNewFormat.toLowerCase();
  201. var iY=0,iM=0,iD=0;
  202. iY = ft_1.indexOf('yyyy');
  203. iM = ft_1.indexOf('mm');
  204. iD = ft_1.indexOf('dd');
  205. sYear = sDateStr.substr(iY,4);
  206. sMm = sDateStr.substr(iM,2);
  207. sDd = sDateStr.substr(iD,2);
  208. sDate = ft_2.replace(/yyyy/gi,sYear);
  209. sDate = sDate.replace(/mm/gi,sMm);
  210. sDate = sDate.replace(/dd/gi,sDd);
  211. return sDate;
  212. },
  213. /**
  214. * 日期比较函数
  215. * 判断如果sDate1大于sDate2就给出sMsg提示
  216. * @param String sDate1 (必需) 开始日期(日期的格式支持 yyyymmdd、yyyy-mm-dd、yyyy/mm/dd)
  217. * @param String sDate2 (必需) 终止日期(日期的格式支持 yyyymmdd、yyyy-mm-dd、yyyy/mm/dd)
  218. * @param String sMsg (必需) 自定义的提示信息
  219. * @return boolean 比较结果 true:sDate1小于或等于sDate2,false:sDate1大于sDate2
  220. * <pre>
  221. * 使用举例:
  222. * var _aResult = CFW.oDate.fnCompareDate("20120110","20120110","日期比较失败");
  223. * </pre>
  224. */
  225. fnCompareDate : function (sDate1,sDate2,sMsg) {
  226. var sYear ='';
  227. var sMonth = '';
  228. var sDay = '';
  229. var sDate_1 = '';
  230. var sDate_2 = '';
  231. var arry;
  232. var s = '';
  233. var i = 0,iDate1 = 0,iDate2 = 0;
  234. var b1 = false;
  235. var b2 = false;
  236. if(CFW.oValid.fnIsDate(sDate1,"yyyymmdd")||CFW.oValid.fnIsDate(sDate1,"yyyy-mm-dd")||CFW.oValid.fnIsDate(sDate1,"yyyy/mm/dd")){
  237. b1 = true;
  238. }
  239. if(CFW.oValid.fnIsDate(sDate2,"yyyymmdd")||CFW.oValid.fnIsDate(sDate2,"yyyy-mm-dd")||CFW.oValid.fnIsDate(sDate2,"yyyy/mm/dd")){
  240. b2 = true;
  241. }
  242. if(!b1){
  243. CFW.oWin.fnAlert(sDate1 + ' 日期不正确!');
  244. return false;
  245. }
  246. if(!b2){
  247. CFW.oWin.fnAlert(sDate2+' 日期不正确!');
  248. return false;
  249. }
  250. i = sDate1.indexOf('-');
  251. if(i > 0){
  252. s = "-";
  253. }
  254. i = sDate1.indexOf('/');
  255. if(i > 0){
  256. s = "/";
  257. }
  258. if(s == ''){
  259. sDate_1 = sDate1;
  260. }else{
  261. arry = sDate1.split(s);
  262. sYear = arry[0];
  263. sMonth = arry[1];
  264. sDay = arry[2];
  265. sDate_1 = sYear + sMonth + sDay;
  266. }
  267. s = "";
  268. i = sDate2.indexOf('-');
  269. if(i > 0){
  270. s = "-";
  271. }
  272. i = sDate2.indexOf('/');
  273. if(i > 0){
  274. s = "/";
  275. }
  276. if(s == ''){
  277. sDate_2 = sDate2;
  278. }else{
  279. arry = sDate2.split(s);
  280. sYear = arry[0];
  281. sMonth = arry[1];
  282. sDay = arry[2];
  283. sDate_2 = sYear + sMonth + sDay;
  284. }
  285. iDate1 = parseInt(sDate_1,10);
  286. iDate2 = parseInt(sDate_2,10);
  287. //如果参数1大于参数2,弹出消息
  288. if(iDate1 <= iDate2){
  289. return true;
  290. }else{
  291. //如果传入消息,则弹出提示
  292. if(!(sMsg==null||sMsg==""||sMsg.length==0)){
  293. CFW.oWin.fnAlert(sMsg);
  294. }
  295. return false;
  296. }
  297. },
  298. /**
  299. * 日期比较函数 (fnCompareDate2)
  300. * 主要是判断如果sDate1大于sDate2就给出sMsg提示,并光标自动定位到oName控件上
  301. * @param oName 录入控件 (必需)
  302. * @param String sDate1 (必需) 开始日期(日期的格式支持 yyyymmdd、yyyy-mm-dd、yyyy/mm/dd)
  303. * @param String sDate2 (必需) 终止日期(日期的格式支持 yyyymmdd、yyyy-mm-dd、yyyy/mm/dd)
  304. * @param String sMsg (必需) 自定义的提示信息
  305. * @return boolean 比较结果 true:sDate1小于或等于sDate2,false:sDate1大于sDate2
  306. * <pre>
  307. * 使用举例:
  308. * var _aResult = CFW.oDate.fnCompareDate2(aform.test,"20120110","20120110","日期比较失败");
  309. * </pre>
  310. */
  311. fnCompareDate2 : function (oName,sDate1,sDate2,sMsg) {
  312. var b = this.fnCompareDate(sDate1,sDate2,sMsg);
  313. var inp = $(oName);
  314. if(!b){
  315. setTimeout(function(){inp.focus();},0);
  316. }
  317. return b;
  318. }
  319. };