嗨,有没有人知道英国日期格式的注册表例如日/月/年。
dd或mm可以是1个字符,例如2010年1月1日,但年份必须始终为4个字符。
提前致谢
答案 0 :(得分:11)
^\d{1,2}/\d{1,2}/\d{4}$
将匹配1/1 / 2000,07 / 05/1999,但也匹配99/77/8765。
因此,如果您想进行一些基本的合理性检查,则需要
^(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/\d{4}$
这仍然会与31/02/9999相匹配,所以如果你想抓住它们,它会变得更加毛茸茸:
^(?:(?:[12][0-9]|0?[1-9])/0?2|(?:30|[12][0-9]|0?[1-9])/(?:0?[469]|11)|(?:3[01]|[12][0-9]|0?[1-9])/(?:0?[13578]|1[02]))/\d{4}$
但这仍然不会闰年。因此,修改a beast of a regex from regexlib.com:
^(?:(?:(?:(?:31\/(?:0?[13578]|1[02]))|(?:(?:29|30)\/(?:0?[13-9]|1[0-2])))\/(?:1[6-9]|[2-9]\d)\d{2})|(?:29\/0?2\/(?:(?:(1[6-9]|[2-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:0?[1-9]|1\d|2[0-8])\/(?:(?:0?[1-9])|(?:1[0-2]))\/(?:(?:1[6-9]|[2-9]\d)\d{2}))$
将匹配
1/1/2001
31/5/2010
29/02/2000
29/2/2400
23/5/1671
01/1/9000
并失败
31/2/2000
31/6/1800
12/12/90
29/2/2100
33/3/3333
总而言之,正则表达式可以匹配日期;验证它们不是他们的强项,但如果它们都是你可以使用的,那肯定是可能的。但看起来很恐怖:)
答案 1 :(得分:4)
正则表达不适合这项工作。
很难(但可能)提出正则表达式以匹配有效日期。确保2月在闰年上有29
天这样的事情在正则表达式中不容易实现。
而是检查您的语言库是否提供了验证日期的任何功能。
PHP有一个名为checkdate的函数:
bool checkdate ( int $month , int $day , int $year)
答案 2 :(得分:1)
\b(0?[1-9]|[12][0-9]|3[01])[/](0?[1-9]|1[012])[/](19|20)?[0-9]{2}\b
匹配:
但也是无效日期,例如2月31日
答案 3 :(得分:0)
^\d{1,2}/\d{1,2}/\d{4}$
在大括号中有最小和最大字数。 \d
表示数字,^
开头,$
字符串结尾。
答案 4 :(得分:0)
\b(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d
这不会验证日期,但您可以检查格式
答案 5 :(得分:0)
我遇到了类似的要求。 这是完整的正则表达式以及闰年验证。 格式:dd / MM / yyyy
(3 [01] | [12] \ d | 0 [1-9])/(0 [13578] | 10 | 12)/((?0000)\ d {4})|(30 | [12] \ d | 0 [1-9])/(0 [469] | 11)/((?0000)\ d {4})|(2 [0-8] | [01] \ d | 0 [1-9])/(02)/((?0000)\ d {4})| 29 /(02)/(1600 | 2000 | 2400 | 2800 | 00)| 29 /(02)/(\ d \ d)(0 [48] | [2468] [048] | [13579] [26])
可以轻松修改为美国格式或其他欧盟格式。
<强>编辑:强>
(3 [01] | [12] \ d | 0 [1-9])/(0 [13578] | 10 | 12)/((?0000)\ d {4})|(30 | [12] \ d | 0 [1-9])/(0 [469] | 11)/((?0000)\ d {4})|(2 [0-8] | [01] \ d | 0 [1-9])/(02)/((?0000)\ d {4})| 29 /(02)/(1600 | 2000 | 2400 | 2800 | 00)| 29 /(02)/( \ d \ d)(0 [48] | [2468] [048] | [13579] [26])
答案 6 :(得分:0)
您想要做两件事,我认为最好单独考虑
1)您想确保日期是真实的实际日期。 例如,2019-02-29不是真实日期,而2020-02-29是真实日期,因为2020年是闰年
2)你想检查日期的格式是否正确(所以dd / mm / yyyy)
第二点可以通过简单的RegEx轻松完成,其中有很多例子。
更复杂的是,如果你问Firefox 2019-02-29是真实的日期,它会返回NaN,这是你所期望的。
另一方面,Chrome会说这是一个真实的约会并且会在2019年3月1日回复 - 这将验证Chrome也会因为某些奇怪的原因也接受一位数字作为正确的日期,将其输入“2”并且它将从2001年开始给你完整的日期 - 这将验证
所以第一步是创建一个试图破译日期的函数(无论格式如何)并跨浏览器工作以返回指示日期是否有效的布尔值
function validatableDate(value)
{
Date.prototype.isValid = function()
{ // An invalid date object returns NaN for getTime() and NaN is the only
// object not strictly equal to itself.
return this.getTime() === this.getTime();
};
minTwoDigits = function(n)
{ //pads any digit less than 10 with a leading 0
return (parseInt(n) < 10 ? '0' : '') + parseInt(n);
}
var valid_date = false;
var iso_array = null;
// check if there are date dividers (gets around chrome allowing single digit numbers)
if ((value.indexOf('/') != -1) || (value.indexOf('-') != -1)) { //if we're dealing with - dividers we'll do some pre-processing and swap them out for /
if (value.indexOf('-') != -1) {
dash_parts = value.split('-');
value = dash_parts.join("/");
//if we have a leading year, we'll put it at the end and work things out from there
if (dash_parts[0].length > 2) {
value = dash_parts[1] + '/' + dash_parts[2] + '/' + dash_parts[0];
}
}
parts = value.split('/');
if (parts[0] > 12) { //convert to ISO from UK dd/mm/yyyy format
iso_array = [parts[2], minTwoDigits(parts[1]), minTwoDigits(parts[0])]
} else if (parts[1] > 12) { //convert to ISO from American mm/dd/yyyy format
iso_array = [parts[2], minTwoDigits(parts[0]), minTwoDigits(parts[1])]
} else //if a date is valid in either UK or US (e.g. 12/12/2017 , 10/10/2017) then we don't particularly care what format it is in - it's valid regardless
{
iso_array = [parts[2], minTwoDigits(parts[0]), minTwoDigits(parts[1])]
}
if (Array.isArray(iso_array)) {
value = iso_array.join("-");
var d = new Date(value + 'T00:00:01Z');
if (d.isValid()) //test if it is a valid date (there are issues with this in Chrome with Feb)
{
valid_date = true;
}
//if the month is Feb we need to do another step to cope with Chrome peculiarities
if (parseInt(iso_array[1]) == 2) {
month_info = new Date(iso_array[0], iso_array[1], 0);
//if the day inputed is larger than the last day of the February in that year
if (iso_array[2] > month_info.getDate()) {
valid_date = false;
}
}
}
}
return valid_date;
}
可以压缩到
function validatableDate(t) {
Date.prototype.isValid = function () {
return this.getTime() === this.getTime()
}, minTwoDigits = function (t) {
return (parseInt(t) < 10 ? "0" : "") + parseInt(t)
};
var a = !1,
i = null;
return -1 == t.indexOf("/") && -1 == t.indexOf("-") || (-1 != t.indexOf("-") && (dash_parts = t.split("-"), t = dash_parts.join("/"), dash_parts[0].length > 2 && (t = dash_parts[1] + "/" + dash_parts[2] + "/" + dash_parts[0])), parts = t.split("/"), i = parts[0] > 12 ? [parts[2], minTwoDigits(parts[1]), minTwoDigits(parts[0])] : (parts[1], [parts[2], minTwoDigits(parts[0]), minTwoDigits(parts[1])]), Array.isArray(i) && (t = i.join("-"), new Date(t + "T00:00:01Z").isValid() && (a = !0), 2 == parseInt(i[1]) && (month_info = new Date(i[0], i[1], 0), i[2] > month_info.getDate() && (a = !1)))), a
}
这会让你进行跨浏览器测试,看看是否可以验证日期,并且它会读取&amp;以格式解密日期
一旦您验证了日期是真实的,正确的,您可以使用正则表达式测试格式。所以对于UK dd / mm / yy
function dateUK(value) {
valid_uk_date=false;
valid_date=validatableDate(value);
if(valid_date && value.match(/^(0?[1-9]|[12][0-9]|3[01])[\/](0?[1-9]|1[012])[\/]\d{4}$/))
{ valid_uk_date=true;
}
return valid_uk_date;
}
然后您知道日期是真实的,并且格式正确。
对于yyyy-mm-dd格式,您可以:
function dateISO(value) {
valid_iso_date=false;
valid_date=validatableDate(value);
if(valid_date && value.match(/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/))
{ valid_iso_date=true;
}
return valid_iso_date;
}
这取决于您想要多么彻底,对于格式理智的粗略检查,RegEx可能足以满足您的目的。但是,如果您想测试日期是否真实,并且格式是否有效,那么这将有助于指导您一路走来
由于