2013-11-22 207 views
0

只給什麼我試圖做一些背景:javascript日期驗證

  • 我在美國的美國機器上
  • 我使用鉻
  • 我在控制面板 - >區域和語言中更改我的機器設置 - 「英語(英國)」
  • 在Chrome下 - >設置 - >語言和輸入設置,我刪除了「英語(美國)」,並添加了「英語)「

我有一個帶有一個輸入框的html頁面,我想驗證輸入框中的文本是基於用戶客戶端語言環境的有效日期。所以在美國用戶可以輸入「11/20/2013」​​,英國用戶可以輸入「2013年11月20日」。

<input type="text" id="dt" /> 
<input type="button" id="validate" value="validate" /> 

<script> 
$(document).ready(function() { 
    $('#validate').click(function() { 
     if (isNaN(Date.parse($('#dt').val())) == true) 
      alert('date is invalid!'); 
     else 
      alert('valid date'); 
    }); 
}); 
</script> 

See jsFiddle example

看來,Date.parse()總是期望美國格式(DD/MM/YYYY)。任何想法如何我可以得到基於客戶端區域設置的驗證?

+0

我認爲這個答案會幫助你:http://stackoverflow.com/a/2587398/693275 –

+1

你應該告訴用戶日期應該在什麼格式,因爲有很多變化,你會有相當多的任務試圖驗證所有的日期變化,並且當用戶無法使用時會讓用戶感到困惑,並且他們不容易找到日期格式。 – adeneo

+0

adeneo我看到你在說什麼,但我不想強迫用戶輸入不同地區的格式。爲什麼英國用戶需要以美國格式輸入,爲什麼美國用戶需要以英國格式輸入? – malkassem

回答

1

我不相信用戶將在系統或瀏覽器上具有正確的區域設置。無論如何,我也不相信瀏覽器會正確地遵守這些設置。有時候它會起作用,有時它也不會。日期解析是高度實現特定的。

而是考慮使用像moment.js這樣的庫。在你的應用程序的某個地方,你可以詢問用戶的語言和語言環境。然後您可以使用它來了解如何正確解析本地日期。

例如:

moment.lang("en-us"); 
console.log(moment("01/02/2013","L").format("LL")); // "January 2 2013" 

moment.lang("en-gb"); 
console.log(moment("01/02/2013","L").format("LL")); // "1 February 2013" 

無論如何,你可能會做最好到附近的某處場顯示用戶自己的格式,和/或使用日期選擇器控制。

+0

這讓我真的很接近我想要的地方。我唯一的問題是現在這就是爲什麼JavaScript中有一個函數「toLocaleDateString()」,而不是解析日期的函數。 – malkassem

+0

它在* new Date([string])'構造函數中,或'Date.parse([string])'函數中做了同樣的事情。問題在於,不同的Web瀏覽器都以不同的方式實現它。 'toLocalDateString()'同樣適用,你會發現不同瀏覽器之間的輸出變化很大,甚至在同一瀏覽器的不同版本之間也會發現變化。如果你不關心一致性,那麼你可以使用這些。但是大多數應用程序需要的不僅僅是這些,這就是爲什麼像[moment.js](http://momentjs.com)這樣的庫存在的原因。 –

+0

我真的很感激你的迴應,並試圖幫助我解決這個問題。新的日期([字符串])總是返回「無效的日期」,每當我試圖解析任何非美國格式的日期,無論我在我的瀏覽器上有什麼設置。我沒有嘗試任何其他瀏覽器,所以它可能只是一個鉻合金問題。我會試試moment.js。 – malkassem