2013-11-22 136 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