我有一个输入文本,我在其中获取日期:
<input type="text" name="myDate" />
提交表单后,我将此日期保存到数据库中,并使用日期格式:
#DateFormat(myDate, "yyyy-mm-dd")#
如果用户输入:02/19/1948,则保存正确:1948-02-19。但是如果用户输入:02191948,则保存:7901-05-07。为什么?有谁知道我该如何解决?
谢谢
我有一个输入文本,我在其中获取日期:
<input type="text" name="myDate" />
提交表单后,我将此日期保存到数据库中,并使用日期格式:
#DateFormat(myDate, "yyyy-mm-dd")#
如果用户输入:02/19/1948,则保存正确:1948-02-19。但是如果用户输入:02191948,则保存:7901-05-07。为什么?有谁知道我该如何解决?
谢谢
ColdFusionDateFormat()
需要一个有效的日期表示。当涉及到什么类型的输入被认为是有效的时,ColdFusion 非常草率。安全日期输入是ODBC 文字和ISO 8601 的大部分内容。谨防格式陷阱mm/dd
,dd.mm
如果可能的话,完全避免它们。
您要使用的是LSParseDateTime()。它允许您指定您期望的语言环境和格式,并使 ColdFusion 根据输入解析日期对象。但它不是故障安全的,这意味着如果try-catch
输入根本不匹配,您必须这样做。有一个故障安全LSIsDate(),它告诉您输入在指定的语言环境中是否被认为是有效的。但无论哪种方式,它都是一种格式检测游戏。为月、日和年设置固定<select>
标签是避免问题的最简单方法。
本地化日期输入的松散演示:
<cfset myLocale = "en_US">
<cfset myDateFormat = "yyyy-mm-dd">
<cfset dateByInput = "">
<cfset errorReason = "">
<cfif structKeyExists(FORM, "myDate")>
<cfif lsIsDate(FORM["myDate"], myLocale)>
<cftry>
<cfset dateByInput = lsParseDateTime(FORM["myDate"], myLocale, myDateFormat)>
<cfcatch>
<cfset errorReason = ("Your input is invalid. Please enter in the following format: " & myDateFormat)>
</cfcatch>
</cftry>
<cfelse>
<cfset errorReason = ("Your input is invalid. Please enter in the following format: " & myDateFormat)>
</cfif>
</cfif>
<cfset dateByInputIsValid = isDate(dateByInput)> <!--- note: it's sufficient to use the unlocalized date check here, since dateByInput is either not valid at all or a (universal) date object --->
<cfif dateByInputIsValid>
<!--- store date input in database --->
<cftry>
<cfset myDatasource = "exampleDS">
<cfquery datasource="#myDatasource#">
INSERT INTO `myDatabase`.`myTable` ( `myDateColumn` ) VALUES (
<cfqueryparam value="#dateByInput#" cfSqlType="CF_SQL_TIMESTAMP">
)
</cfquery>
<cfcatch>
<cfset errorReason = "Oh noes, something went wrong attempting to save your input.">
</cfcatch>
</cftry>
</cfif>
<cfoutput>
<cfif dateByInputIsValid>
<p>Date input valid: #lsDateFormat(dateByInput, myDateFormat, myLocale)#</p>
<cfif len(errorReason)>
<p>#errorReason#</p>
<cfelse>
<p>Input successfully stored in database.</p>
</cfif>
<cfelse>
<cfif len(errorReason)>
<p>#errorReason#</p>
</cfif>
<form method="post">
<input type="text" name="myDate" />
<button type="submit">send</button>
</form>
</cfif>
</cfoutput>