Coldfusion 10 DateFormat问题

时间:2013-05-15 05:03:01

标签: coldfusion date-format coldfusion-10 cfml

我正在使用DateFormat函数将日期转换为以下格式:yyyy-mm-dd。这是日期的原始格式:dd-mm-yyyy。以下是代码片段:

<cfset newdate = #DateFormat(Trim(mydate), "yyyy-mm-dd")# />

问题是我在不同的日期得到不同的结果。例如:

  • 如果我的原始日期是:15-05-2013 dd-mm-yyyy
  • 结果是:2013-05-15 yyyy-mm-dd

但是,如果我更改输入并且:

  • 原始日期为:01-05-2013 dd-mm-yyyy
  • 结果是:2013-01-05 yyyy-dd-mm

任何有关错误的帮助或指导都将受到高度赞赏。

2 个答案:

答案 0 :(得分:7)

我不同意另一个答案。问题的真正原因是 DateFormat不是为处理非美国日期字符串而设计的

标准CF日期函数始终使用美国日期解析规则。这意味着当您传递一个模糊日期字符串(如01-05-2013)时,会根据U.S. English date conventions对其进行解析。在这种情况下,月份首先即“mm-dd-yyyy”。所以结果将始终是1月5日,而不是5月1日。

在某些情况下,你很幸运。使用字符串15-05-2013,显然没有第15个月,因此CF / java必须自动交换月和日,而不是抛出错误。这就是似乎正确处理一些dd-mm-yyyy日期字符串而不是其他日期字符串的原因。

如果要解析非美国日期字符串,则应使用LS(区域设置敏感)日期函数。但是,根据文档破折号,"-"在大多数非美国语言环境中不是标准日期分隔符:只有荷兰语和葡萄牙语(标准)。因此,您需要更改分隔符或在解析日期时使用这两个区域设置中的一个:

        lsDateFormat( myDate, "yyyy-mm-dd", "pt_PT")

旁注:

另外,DateFormat确实需要日期对象。但是,与CF中的大多数函数一样,它也足够灵活,可以接受日期 string 。这允许您将其用作从日期转换的懒惰快捷方式 string =&gt; date object =&gt;然后再次返回(格式化)日期字符串。最好使用日期对象(你真的应该验证日期字符串),但这是另一个对话......

答案 1 :(得分:5)

问题是DateFormat需要一个日期对象,并返回一个字符串。

你传给它一个字符串,而不是日期。你想要做的是首先把你的字符串(01-05-2013等)变成日期对象。

为此,我建议使用ParseDateTimeLSParseDateTime和/或LSDateFormat。

e.g。

<cfset originalDateString = "01-05-2013">

<!--- turn that into a Date --->
<cfset dateObject = ParseDateTime(originalDateString)>

<cfset newdateString = DateFormat(dateObject, "yyyy-mm-dd")>

或者,如果你知道你的字符串总是采用dd-mm-yyyy格式,你可以自己解析字符串,例如将其视为由连字符分隔的列表。

<cfset dd = listFirst(originalDateString, "-")>
<cfset mm = listGetAt(originalDateString, 2, "-")>
<cfset yy = listLast(originalDateString, "-")>