查看積分策略說明發表回覆
Discuz! 代碼
提示插入
直接插入
說明訊息

插入粗體文本 插入斜體文本 插入下劃線 置中對齊 插入超級連結 插入信件位址 插入圖像 插入 flash 插入代碼 插入引言 插入列表
刪除線 直線分隔線 虛線分隔線
    
添加文字底框
內容 [字數檢查]:

表情符號

更多 Smilies
字型大小 |||
溫馨提示:本區開放遊客瀏覽。


文章關鍵字 : [功能說明]
(關鍵字可加強搜索準確性, 如關鍵字多於一組, 請以 , 作分隔, e.g. : 阿笨,shiuh,第一笨)

 關閉 URL 識別 | html 禁用
 關閉 表情符號 | 表情符號 可用
 關閉 Discuz! 代碼 | Discuz! 代碼 可用
使用個人簽名
接收新回覆信件通知
推薦放檔網絡空間

檔案(Torent, zip等)
  1. freedl
  2. multiupload
  3. btghost
  4. 便當狗
  5. mediafire
  6. pillowangel
圖片(JPG, GIF等)
  1. hotimg
  2. tinypic
  3. mousems2
  4. imageshack
  5. imm.io
>>>歡迎推薦好用空間


最新10篇文章回顧
多多

 發表於 2012-5-31 02:52 PM

我今天收到公司一張問題單,也是自串轉日期的錯,
中間有一段就是把字串先轉為數字做組合再去做日期的比對,
我的做法是直接調用 new Number () 即可。

我把程式打在下面,希望有些許幫助:

// 傳入值
// startDate => 097/01/01
// endDate => 101/05/31

function dateCompare (startDate, endDate) {

    var start = startDate.split("/");
    var end = endDate.split("/");

    var sTimeStr =
        new Number(start[1]) + "/" +
        new Number(start[2]) + "/" +
        (new Number(start[0]) + 1911);
    var eTimeStr =
        new Number(end[1]) + "/" +
        new Number(end[2]) + "/" +
        (new Number(end[0]) + 1911);

    var sTime = (Date.parse(sTimeStr)).valueOf();
    var eTime = (Date.parse(eTimeStr)).valueOf();

    if(sTime < eTime){
        alert('日期正確');
    } else {
        alert('日期錯誤');
    }
}


Acute

 發表於 2009-3-8 04:50 AM


引用:
daidai寫到:
暈@@...實際將字串"0200"到"0220"輸入....eval(x)答案分別為

"0200" => 128
"0201" => 129
"0202" => 130
"0203" => 131
"0204" => 132
"0205" => 133
"0206" => 134
"0207" => 135
"0208" => 208
"0209" => 209
"0210" => 136
"0211" => 137
"0212" => 138
"0213" => 139
"0214" => 140
"0215" => 141
"0216" => 142
"0217" => 143
"0218" => 218
"0219" => 219
"0220" => 144

字串"0201"使用eval(x.toString())印出的還是129..@@
規則不知道是什麼...不過的確...我上述的方式是有錯誤的=.=(沒實際操作)..拍謝~


其實, 規則很容易抓出來
0###, 以0 為開頭, 會被當作8進位的數字
但是, 如果### 裡面出現8/9, 超過8進位, 所以函式就認定為10進位
所以, 要用這個函式也不困難, 先檢查陣列前方的0, 都刪除, 就不會出錯了 @@

Acute.


GERRYccc

 發表於 2009-2-28 11:31 PM

這樣二月會遇到潤年 2/29 的問題..
可以參考:http://blog.wu-boy.com/2008/04/30/194/  (JQuery產生日曆)
還有參考:http://roseroo.spaces.live.com/B ... .entry?sa=381515159 (日期檢核)


ROACH

 發表於 2009-2-28 02:06 PM

其實要排除使用者輸入的日期
最好的方法應該是寫個1到12月再依照每月的大月小月
事先丟到陣列裡去推說使用者輸入的日期是否正確.....

哈!!!當初還沒開始動工先怎作
想說先解決2月的問題再說
所以就先緊急上來問的
謝謝大家的幫助~~~
後來初步想法除的可以用aparrow這招以外
也可以這樣作

if ( ( !( x.match(/\D/)  == null ) ) || ( x.length != 8 ) )
{
  alert("格式錯誤");
  return false;
}

var m = new Array();
m[1] = 31;
m[2] = 28;
m[3] = 31;
m[4] = 30;
m[5] = 31;
m[6] = 30;
m[7] = 31;
m[8] = 31;
m[9] = 30;
m[10] = 31;
m[11] = 30;
m[12] = 31;

xx = parseFloat(x.substring(4,6));
dd = parseFloat(x.substring(6,8));


if ( m[xx] < dd )
   alert("日期錯誤");
else
    alert("日期正確");
}
checkdate("20090230");
至於eval的作法我是看一本javascript語法
裡面說eval可以拿來把字串轉成數字
我才想到說拿eval來試試看!沒想到沒那麼簡單
後來在看其它網站才發現到要用parseFloat



sparrow你這招很厲害喔!我從沒想到還有這個方法

[ROACH 在  2009-2-28 02:59 PM 作了最後編輯]


sparrow

 發表於 2009-2-27 05:58 PM

使用Regular Expression

  function checkdate(){
    var x="0228";
    var Reg=new RegExp("([0][2]([2][8-9]|[3][0-1]))");
        if(x.search(Reg)>=0){
          alert("排除輸入的值 "+x);
        }else{
          alert("輸入正確");
        }
  }
  window.onload=checkdate;

如不考慮輸入字串長度,只要字串內有包含0228、0229、0230、0231的字眼皆會被排除。
當然也可以設定從開頭到第四個字元來比對是否match。


dayi

 發表於 2009-2-26 08:39 PM


引用:
daidai寫到:
字串"0201"使用eval(x.toString())印出的還是129..@@


這個部分我也沒實測
但這樣子的結果真的很奇怪
eval的輸入是string
所以0201變成string之後應該會是"0201"再輸入到eval
理論上來說應該是原本的字串
這真的蠻奇怪的

樓上的人說的很對
儘量不要用eval
雖然eval功能很強
但是也很容易出錯


daidai

 發表於 2009-2-26 12:08 AM

暈@@...實際將字串"0200"到"0220"輸入....eval(x)答案分別為

"0200" => 128
"0201" => 129
"0202" => 130
"0203" => 131
"0204" => 132
"0205" => 133
"0206" => 134
"0207" => 135
"0208" => 208
"0209" => 209
"0210" => 136
"0211" => 137
"0212" => 138
"0213" => 139
"0214" => 140
"0215" => 141
"0216" => 142
"0217" => 143
"0218" => 218
"0219" => 219
"0220" => 144

字串"0201"使用eval(x.toString())印出的還是129..@@
規則不知道是什麼...不過的確...我上述的方式是有錯誤的=.=(沒實際操作)..拍謝~


dayi

 發表於 2009-2-25 08:32 PM


引用:
ROACH寫到:
    alert(eval(x));


樓主稍微小改一下就行了
alert(eval(x.toString()));



引用:
daidai寫到:
eval可能只可以輸出數值


eval用來組字串也是ok的啊
這位網兄記錯了吧


陽だまり

 發表於 2009-2-25 07:09 PM


引用:
daidai寫到:
抱歉~看不太懂你的意思...
0201當作16進位輸出為C9
C在16進位中代表12
eval可能只可以輸出數值
所以以12輸出...再加上後面的9..即為129囉

那0208在16進位輸出為D0
D在16進位中代表13
也就是說13先輸出,再加上後面的0
也就是130囉

那0201是129
0202用推的來看的話,照理來說是130
那0208也是130
那那那.............

好了,不開玩笑了
實測了一下,只有在某條件達成時
才會是8進位或者daidai兄提到的算法這樣

還是等高手來為小弟解答這樣


daidai

 發表於 2009-2-25 05:45 PM


引用:

那我想M$的小算盤應該是故障了
8進位201轉10進位為129
16進位201轉10進位為513


抱歉~看不太懂你的意思...
0201當作16進位輸出為C9
C在16進位中代表12
eval可能只可以輸出數值
所以以12輸出...再加上後面的9..即為129囉


本主題回覆較多,請 點擊這裡 檢閱。



所在時區為 GMT+8, 現在時間是 2024-5-3 04:30 AM
清除 Cookies - 連絡我們 - TWed2k © 2001-2046 - 純文字版 - 說明
Discuz! 0.1 | Processed in 0.022291 second(s), 7 queries , Qzip disabled