多多
|
發表於 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
"020 8" => 208
"020 9" => 209
"0210" => 136
"0211" => 137
"0212" => 138
"0213" => 139
"0214" => 140
"0215" => 141
"0216" => 142
"0217" => 143
"021 8" => 218
"021 9" => 219
"0220" => 144
字串"0201"使用eval(x.toString())印出的還是129..@@
規則不知道是什麼...不過的確...我上述的方式是有錯誤的=.=(沒實際操作)..拍謝~
其實, 規則很容易抓出來
0###, 以0 為開頭, 會被當作8進位的數字
但是, 如果### 裡面出現8/9, 超過8進位, 所以函式就認定為10進位
所以, 要用這個函式也不困難, 先檢查陣列前方的0, 都刪除, 就不會出錯了 @@
Acute.
| |
GERRYccc
|
發表於 2009-2-28 11:31 PM |
|
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囉
| |
本主題回覆較多,請 點擊這裡 檢閱。 |