我想确保用户上传csv的日期格式为dd-mmm-yy(10-Feb-14)。我做了我的研究,我可以看到没有一个ColdFusion日期函数帮助我解决这个问题。
我可以使用IsValid函数进行正则表达式验证。我不擅长写正则表达式。感谢您的帮助。
答案 0 :(得分:0)
以下是一个快速示例,说明如何通过分离的闰年检查来实现...
<cffunction name="isCorrectDateFormat" returntype="Boolean" output=false >
<cfargument name="Input" type="String" />
<cfscript>
var Months30 = "Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec";
var Months31 = "Jan|Mar|May|Jul|Aug|Oct|Dec";
var DatePattern = "(?i)(?:[1-9]|[12][0-9])-(?:#Months30#|Feb)-\d\d|30-(?:#Months30#)-\d\d|31-(?:#Months31#)-\d\d";
return Arguments.Input.matches(DatePattern)
AND ( left(Input,6) EQ '29-Feb' IMP isLeapYear('20'&right(Arguments.Input,2)) )
;
</cfscript>
</cffunction>
这并不完美(具体而言,你可能需要更高级的逻辑而不是以20
作为年份的前缀),但它会让你进入球场。
感兴趣的是IMP
Implication operator - 其中“IMP b”表示“如果a为假,则返回true。如果a为真,则返回b”,因此是进行闰年检查的一种方式只有在需要的时候。
正则表达式本身可以按如下方式细分:
(?ix) ## i flag enables case-insensitive, x enables comment-mode
## match 1-9 or 10-29 days for every month (leap years dealt with separately)
(?:[1-9]|[12][0-9])-(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec|Feb)-\d\d
|
## or match 30 days for all except Feb
30-(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-\d\d
|
## or match 31 days for relevant months
31-(?:Jan|Mar|May|Jul|Aug|Oct|Dec)-\d\d
对于四位数年份,每个年份的最终\d\d
可以是\d\d\d\d
或\d{4}
,也可以是(?:19\d\d|2[01]\d\d)
,具体取决于所涉及的具体日期范围。
答案 1 :(得分:0)
根据Peter的评论,我修改了我的代码..我使用了一个简单的正则表达式,然后在另一个验证中小心休息。
<cfset mydate = "31-Apr-12" />
<cfset flag = isValid("regular_expression", Ucase(mydate), "^(([0-9])|([0-2][0-9])|([3][0-1]))\-(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)\-\d{2}$") />
<cfset aplhaMonths = "APR,JUN,SEP,NOV">
<cfif flag>
<cfif ListGetAt(mydate,1,"-") EQ 31 AND ListFindNocase(aplhaMonths, ListGetAt(mydate,2,"-")) >
<cfset flag = false />
<cfelseif ListGetAt(mydate,1,"-") GT 29 AND ListGetAt(mydate,2,"-") EQ "FEB">
<cfset flag = false />
<cfelseif ListGetAt(mydate,1,"-") EQ 29 AND ListGetAt(mydate,2,"-") EQ "FEB" AND NOT IsLeapYear(mydate)>
<cfset flag = false />
</cfif>
</cfif>
答案 2 :(得分:0)
使用正则表达式 for date =&#34; ^ \ d \ d \ d \ d-(0 [1-9] | 1 [0-2]) - ([0] [1-9] | [12] [0-9 ] | 3 [01])$&#34; for datetime =&#34; ^ \ d \ d \ d \ d-(0 [1-9] | 1 [0-2]) - ([0] [1-9] | [12] [0-9 ] | 3 [01])(00 | [0] [0-9] | 1 [0-9] | 2 [0-3]):( [0] [0-9] | [0-5] [ 0-9]):([0] [0-9] | [0-5] [0-9])$&#34;
它将严格遵循YYYY-mm-dd,它将不允许yy-mm-dd或yyyy-m-dd oryyyy-mm-d或dd-mm-yyyy。 它不允许h:m:sor h:mm:s或hh:mm:s它只允许(YYYY-MM-DD HH:mm:ss)
答案 3 :(得分:-1)
如果您需要特定的日期格式,例如((YYYY-MM-DD) or (YYYY-MM-DD HH:mm:ss))
它也不应该允许9:9:9时间格式
f(arguments.preparedInput.printFileLastModifiedMin neq“”或arguments.preparedInput.printFileLastModifiedMax neq“”){ local.validMinDateFlag =“是”; local.validMaxDateFlag =“是”;
if (arguments.preparedInput.printFileLastModifiedMin neq "")
local.validMinDateFlag = isValid ("regex", arguments.preparedInput.printFileLastModifiedMin, "^\d\d\d\d-(0[1-9]|1[0-2])-([0][1-9]|[12][0-9]|3[01])$");
if (arguments.preparedInput.printFileLastModifiedMax neq "")
local.validMaxDateFlag = isValid ("regex",arguments.preparedInput.printFileLastModifiedMax, "^\d\d\d\d-(0[1-9]|1[0-2])-([0][1-9]|[12][0-9]|3[01])$");
if (local.validMaxDateFlag eq "NO" or local.validMinDateFlag eq "NO"){
if (local.validMinDateFlag eq "NO")
local.validMinDateFlag = isValid ("regex",arguments.preparedInput.printFileLastModifiedMin, "^\d\d\d\d-(0[1-9]|1[0-2])-([0][1-9]|[12][0-9]|3[01]) (00|[0][0-9]|1[0-9]|2[0-3]):([0][0-9]|[0-5][0-9]):([0][0-9]|[0-5][0-9])$");
if (local.validMaxDateFlag eq "NO")
local.validMaxDateFlag = isValid ("regex",arguments.preparedInput.printFileLastModifiedMax, "^\d\d\d\d-(0[1-9]|1[0-2])-([0][1-9]|[12][0-9]|3[01]) (00|[0][0-9]|1[0-9]|2[0-3]):([0][0-9]|[0-5][0-9]):([0][0-9]|[0-5][0-9])$");
}