2006-12-11

計算網站開張天數

以下這段 Javascript 程式,用來計算特定時間與今天的差距,先抓出使用者電腦的時間,去和指定的時間做計算,最後在格式化成中文的年月日表現方式。原程式是英文的,改成中文版的人並不用心,沒有把程式最佳化一下,只把文字中文化,因為英文有複數要加 s 的問題,中文沒有,所以我就把程式改短一點,拿掉沒有用的判斷。放到 Blog 裡面,設定的指定日期只要是你寫第一篇 Blog 的日子,就可以拿來顯示 Blog 已經開站幾天了。

這一段是宣告定義的部分,可以放在最前面:

<script language="JavaScript">
//<![CDATA[
function HowLongSince(startyear, startmonth, startdate) {
  var DaysInMonth = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
  var today = new Date()
  var thisyear = today.getFullYear();
  var thismonth = today.getMonth();
  var thisdate = today.getDate();
  mstart = new Date(startyear, startmonth, 1);
  mend = new Date(thisyear, thismonth, 1);
  ydiff = thisyear - mstart.getFullYear();
  mdiff = thismonth - mstart.getMonth();
  days1 = (mstart - new Date(startyear, startmonth - 1,startdate))/(24*60*60*1000) - 1;
  days2 = (new Date(thisyear,thismonth,thisdate) - mend)/(24*60*60*1000) + 1;
  dayst = days1 + days2;
  if (dayst >= DaysInMonth[startmonth - 1])  {
    mdiff += 1;
    dayst -= DaysInMonth[startmonth - 1];
  }
  if (ydiff == 0 && mdiff == 0 && dayst == 0)
    message = "今天";
  else {
    if (mdiff > 11) { mdiff = 0; ydiff++; }
    if (mdiff < 0) { mdiff = mdiff + 12; ydiff--; }
    message = (ydiff != 0 ? ydiff + " 年" : "");
    message += (mdiff != 0 ? " " + mdiff + " 個月" : "");
    if (ydiff != 0 && mdiff != 0) message += "又";
    message += (dayst!=0 ? " " + dayst+" 天" : "");
  }
  return message;
}
//]]>
</script>

當要呼叫使用的時候,以下是使用的範例:(紅色的部分自己改日期)

<p>Established:
  <script language="JavaScript">document.write(HowLongSince(2006,11,3)); </script>
</p>

其他應用,可以用來倒數特定日子的到來、或是提醒紀念日,彈性就根據個人需要來調整囉!

回應: 15

匿名 提到...

你好!
不知道為什麼,不管我把第一段的程式放在head裡面或是body裡面,系統都會回覆這樣的訊息:"我們無法剖析您的範本,因為它的結構不完整。 請確定所有的 XML 元素均已正確關閉。
XML 錯誤訊息: The content of elements must consist of well-formed character data or markup."

請大大替我解惑一下,謝謝^^

Abin 提到...

這是個好問題,之前我也犯過類似的錯誤。
如果你和我一樣把這段程式放到網頁元素 HTML/Javascript 模組裡,不會有問題,但是如果是放到樣版原始碼,head or body 裡面,就一定會出事,原因在「特殊符號」的轉換。像 Javascript 裡面用來判斷的大於小於符號: > < 符號,其實是 HTML 標籤的保留字元,直接使用在樣版裡會造成誤判,得到你貼的錯誤訊息。
解決方法有二:第一,將程式裡可能會衝突的保留字元取代掉,像是 > 要改寫成 &gt; 才行。第二種方法比較簡單,在 <script> </script> 標籤後加入宣告,讓樣版知道裡面的「特殊字元」是資料,不要當標籤來解析,宣告的方式如下:
<script type='text/javascript'>
//<![CDATA[
.....
//]]>
</script>
為避免類似的困擾,我把我的範例一併修正加上宣告,已更新。

S™ 提到...

可以囉!謝謝^^

匿名 提到...

請問這個有解決「閏年」(二月有29天)的問題嗎? 謝謝

Abin 提到...

To Zach: 從程式碼來看,並沒有處理閏年的問題。
如果要處理也是可以,就是另外拉一個陣列加入閏年的計算,決定碰到幾個閏年就加幾天。我並沒有要求那麼精準,所以就沒有做了。

匿名 提到...

喔...謝謝!!

Abin 提到...

To zach: 我又看了一下程式碼,想說要不要解決「閏年」的問題,但是仔細一看,根本沒必要啊!
因為我的「開張天數」,是列出幾年幾個月第幾天,如果那是個閏年、閏月,也不會影響天數啊!不過,如果只列出天數的話,那麼和其間有沒有碰到閏年才有影響。如果要變成單純計算天數的程式,而且要考慮閏年的話,程式要改寫很多地方。可以參考一下閏年的原理,自己修改一下。

Shiang 提到...

請問要呼叫使用的那一段要放在哪裡呢?
我是在放最後面 可是出來的時候只有顯示established然後後面沒東西...
請問是出了什麼問題嗎 他跟我電腦時間的設定有關係嗎? 因為我是調成國外的時間格式
謝謝~

Abin 提到...

To A. HSIANG:
只要你把函式的呼叫放在樣板的最前面,而且「無誤」的話,要呼叫使用的那一段要放在哪裡都可以。
呼叫後是空白,應該是宣告的地方有問題。

欣欣 提到...

對不起喲...
想問問這語法是否放在HTML/JavaScript?
如不是那該放在哪兒?
如是的話,為何我把第1個code貼在HTML/JavaScript,第2個code貼在第1個code之下也不行呢?
不好意思打搞你!

Abin 提到...

To 欣欣:
你要直接放在 HTML/JavaScript 元素裡沒問題,不過不要就直接就把兩段 code 統統貼進去存檔,請看一下本文我第二個留言的回覆。
以目前現在的程式碼來看,你把第一段 code 貼進去,要先拿掉第二行和倒數第二行,然後緊接著在後面貼入第二段 code 再存檔,我測試過,這樣就可以了!

mILazI 提到...

谢谢Abin,我找这个找了很久了,居然会无意发现Abin的贡献,谢谢Abin的工作。

王子 提到...

Abin 兄, 不明白。。为什么有两个代码的? 我读过回复了。。。但是不会这些代码。。。。第1组我放入html/script 元件, 但第2组要放在哪里的?

Abin 提到...

To 王子:
其實你檢視我網頁的原始碼,就知道該放哪裡了。第一組是函式宣告,第二組是呼叫使用,以我的使用方式,兩個是放在同一個 html/script 元件裡面。
如果有其他用途、需要多個計數器,可以在樣板原始碼裡宣告一次,然後在「任何」你想安插計數器的地方呼叫,就可以有多個計數器的效果。

Unknown 提到...

因為我是外行的....
但是因為工作的因素要算百日(往者)
要從過世當天開始算到100天
請問你那些程式該怎麼用啊??

張貼留言

歡迎留言或發表意見,不過要理性不做人身攻擊。匿名的朋友得到回應的速度會比較慢喔~
發問相關的禮貌和規矩請先參考這篇文章,不當留言、和本文無關的回應可能會被直接刪除無視喔!