2014-06-17 81 views
0

我需要允許日期採用以下格式:dd/mmm/yyyy此處的代碼。 當我從日期選擇器中選擇數據時,顯示的值爲「dd MMM yyyy」格式。無法允許日期爲dd/mmm/yyyy

但是,如果我在手動輸入日期,例如,如果我輸入「02032014」,它只是按原樣閱讀,不會將其更改爲「2014年3月2日」。

的Javascript:

function CompareDates(id) 
{ 
    var monName = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", 
     "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"); 

    var d = new Date(id); 
    var curr_date = d.getDate(); 
    var curr_month = d.getMonth(monName); 
    var curr_year = d.getFullYear(); 

    return d.format(curr_date + " " + curr_month + " " + curr_year); 
} 

和我的日曆標籤:

<td> 
    <p:calendar 
     value="#{pc_Rpt2202.asat_date}" 
     id="rp2202_input_as_at" 
     styleClass="calendar" 
     maxlength="10" 
     pattern="dd MMM yyyy" 
     onchange="$(this).val(CompareDates($(this).val()))" 
     onfocus="$(this).mask('99/99/9999');" 
    > 
     <p:watermark for="rp2202_input_as_at" value="dd/MMM/yyyy" /> 
     <f:convertDateTime pattern="dd MMM yyyy" /> 
    </p:calendar> 
    </td> 

我可以知道我可以通過允許數據驗證工作解決呢?
這裏有我想要的一個例子:http://www.flyscoot.com/index.php/en/?gclid=CLvPseXn_74CFQyTjgodz5sAEQ

後,我在日期手動輸入,它會自動更改爲DD MMMM yyyy格式而不是從日期選擇器中選擇的。

+0

要將字符串更改爲日期對象,您必須解析字符串,因此需要指定輸入格式,以便知道如何解析它。一旦知道,解析就很簡單。不要試圖使用* Date.parse *,它會失敗。 – RobG

+0

@RobG不好意思,但你能告訴我一個例子嗎?所以對不起,因爲我真的很虛弱在這.. – isg

+0

這裏是一個很好的答案這個問題.http://stackoverflow.com/questions/492994/compare-dates-with-javascript –

回答

0

爲了驗證日期字符串,您需要指定格式是什麼,以便它可以被解析。無論您編寫自己的解析器還是使用其他人的解析器,都需要這樣做。猜測格式不是一個好主意,因爲有很多模糊的格式,有些模糊的有時卻不是別人。

在這種情況下,如果你想輸入作爲ddmmyyy(我建議你使用類似DD/MM/YYY),你可以解析它,創建一個日期對象,然後測試對輸入的日期確認它是有效的,例如:

// Input format ddmmyyy 
function parseDMY(s) { 
    var d = s.substr(0,2); 
    var m = s.substr(2,2) 
    var y = s.substr(4); 
    var date = new Date(y, --m, d); 

    // Check that date is valid, return NaN if not 
    return (date && date.getFullYear() == y && date.getDate() == d)? date : NaN; 
} 

但是,如果你使用像d/M/Y的格式,那麼它的簡單:

// Input format d/m/yyyy, separator can be any non-digit character (-, /, space, etc.) 
// d and m can be one or two digits (e.g. 5 or 05) 
function parseDMY(s) { 
    var b = s.split(/\D+/); 
    var d = new Date(b[2], --b[1], b[0]); 
    return (d && d.getFullYear() == y && d.getDate() == d)? d : NaN; 
} 

注意上面將返回NaN兩個數字的年份,如說1/1/05將成爲1/1/1905。然而,大多數日期字段需要4位數字年,所以你也應該。

您可以使用屏幕提示指定格式。不要只使用佔位符,因爲只要用戶開始鍵入,佔位符就會消失,因此它們不再具有所需格式的引用,除非它們刪除了它們的輸入,並且那些使用不支持佔位符的瀏覽器的用戶將會從來沒有看到它。

+0

我不能使用'return'語句。錯誤:跟蹤錯誤[line:40]實體名稱必須緊跟在實體引用中的'&'後面。 但在這種情況下,我的任務是使用dd MMMM yyyy格式。因爲日期選擇器能夠打印出dd/mm/yyyy格式。但如果我手動輸入日期,它不會改變任何東西。即使我輸入了奇怪的日期 – isg

+0

我有屏幕提示,這是我的日曆標記中所述的水印。 – isg

+0

您問過如何將特定格式的字符串轉換爲日期對象,上面的答案是這樣做的。將生成的日期傳遞給(不恰當地命名的)* CompareDates *函數,它將返回一個格式化的字符串。你如何使用你選擇的日期選擇器(你沒有說出你正在使用哪一個)的工作取決於你。 – RobG

0

您可以使用正則表達式,以防止它匹配您的日期字符串:

var dateReg = /^\d{2}[/s]+\d{2}[/s]+\d{4}$/

然後你就可以判斷你的字符串使用正則表達式匹配:

yourStr.match(dateReg)

+0

嗨!嗯有一個語法錯誤:令牌上的語法錯誤「無效的正則表達式選項」,沒有準確的修正可用 – isg

+0

但是,這不測試有效日期。 ;-)哦,'/ s'似乎不合適。 – RobG

相關問題