2011
Mar
01

實現PHP中mktime的 function,在 function中要注意,時間的單位,在JS中時間的單位是豪秒,而PHP的是秒,所以必須除以1000。

另外JS中月份的算法是從 0開始 , 0~11 ,運算的時候也要將月份特別處理。


mktime : javascript 實作

mktime 一般是要傳入六個值,分別是 「時,分,秒,月,日,年」依序傳入。

setMilliseconds一定要自行設定為0,否則JS millisecond預設是很奇怪的值,會造成算出來的日期多一天。

setDate一要放在 setMonth之前,否則當今天是1/31,這時setMonth(1),時間會變成 2/31,因為2月沒有31號,這樣js的timestamp就會出現計算錯誤。

  1. function mktime(h,m,s,month,day,year){
  2. var d=new Date();
  3. d.setDate(parseInt(day,10));
  4. d.setMonth(parseInt(month,10)-1);
  5. d.setFullYear(parseInt(year,10));
  6. d.setHours(parseInt(h,10));
  7. d.setMinutes(parseInt(m,10));
  8. d.setSeconds(parseInt(s,10));
  9. d.setMilliseconds(0);
  10. return parseInt(d.getTime()/1000);//秒
  11. }

求明天的日期

  1. var d=new Date( );
  2. var t=(mktime(0,0,0,d.getMonth()+1,d.getDate(),d.getFullYear())+86400)*1000;
  3. d.setTime(t);
  4. alert(d.getFullYear()+" "+(d.getMonth()+1)+" "+d.getDate());

求各月份的日期 (大小月與潤年)

  1. function getMonthDay(y,m){
  2. m=parseInt(m);
  3. y=parseInt(y);
  4. switch(m){
  5. case 1: case 3: case 5: case 7: case 8:case 10: case 12:
  6. return 31;
  7. break;
  8. case 2:
  9. if((y%4==0 && y%100!=0) || y%400==0){
  10. return 29;
  11. }
  12. return 28;
  13. break;
  14. default:
  15. return 30;
  16. break;
  17. }
  18. };

取得當月的起始日,與結尾日

  1. //取得XX月份的起始日,與結尾日
  2. function getMonthPeriod(year,month){
  3. var startDate=year+"-"+month+'-1'; month++;
  4. if(month>12){year++;month=1;}
  5. var time = mktime(0,0,0,month,1,year)-1;
  6. var d = new Date(); d.setTime(time*1000);
  7. var endDate=d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate();
  8. return {startDate:startDate,endDate:endDate};
  9. }
測試結果
  1. var s=getMonthPeriod(2011,2);
  2. /* s=data{
  3. startDate = 2011-2-1
  4. endDate = 2011-2-28
  5. }*/

回應 (Leave a comment)