ColdFusion dateformat 格式错误

Posted

技术标签:

【中文标题】ColdFusion dateformat 格式错误【英文标题】:ColdFusion dateformat wrong format 【发布时间】:2017-08-23 21:06:02 【问题描述】:

我有一个输入文本,我在其中获取日期:

<input type="text" name="myDate" />

提交表单后,我将这个日期保存到数据库中,做一个日期格式:

#DateFormat(myDate, "yyyy-mm-dd")#

如果用户输入:02/19/1948,则保存正确:1948-02-19。 但是如果用户输入:02191948,则保存:7901-05-07。为什么?有谁知道我该如何解决?

谢谢

【问题讨论】:

通常日期输入比单个文本框更严格。月、日、年的下拉菜单非常标准,您不必处理此类问题。 我明白了...我有一个 tcal javascript 日历插件,但它允许我输入像 02191948 这样的日期 你知道我是否可以在提交表单之前进行 JS 验证吗? 日期格式返回一个字符串。这是错误的做法。您希望将输入转换为日期对象,并使用查询参数。然后是在使用之前验证输入的问题。实际验证取决于您的业务规则。 请,请,请不要将日期作为字符串存储在您的数据库中。如果您绝对需要,请将其作为 yyyymmdd 发送,您的数据库应该能够解释它的需要。请务必注意 DateFormat() 和 DateTimeFormat() 之间的差异以及它们如何解释 YYYY 和 yyyy。面具会在 12 月底咬你一口。公平警告。 【参考方案1】:

ColdFusion 的DateFormat() 需要一个有效的日期表示。当涉及到什么类型的输入被认为是有效的时,ColdFusion 非常草率。安全日期输入为ODBC literals 和most of ISO 8601。谨防 mm/dddd.mm 这样的格式陷阱,并尽可能避免它们。

您要使用的是LSParseDateTime()。它允许您指定您期望的语言环境和格式,并使 ColdFusion 根据输入解析日期对象。虽然它不是故障安全的,这意味着你必须try-catch它以防输入根本不匹配。有一个故障安全LSIsDate(),它会告诉您输入在指定的语言环境中是否被认为是有效的。但无论哪种方式,它都是一种格式检测游戏。为月、日和年修复 &lt;select&gt; 标签是避免问题的最简单方法。

本地化日期输入的松散演示:

<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>

【讨论】:

以上是关于ColdFusion dateformat 格式错误的主要内容,如果未能解决你的问题,请参考以下文章

ColdFusion格式在电子邮件中丢失

Java学习笔记4.6.1 格式化 - DateFormat类

这种格式的 DateFormat 框架是啥?

详解Java中格式化日期的DateFormat与SimpleDateFormat类

Java基础-日期格式化DateFormat类简介

类DateFormat(子类SimpleDateFormat)