Coldfusion 10 DateFormat问题

rau*_*ash 3 coldfusion date-format coldfusion-10 cfml

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

<cfset newdate = #DateFormat(Trim(mydate), "yyyy-mm-dd")# />
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Lei*_*igh 8

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

标准CF日期函数始终使用美国日期解析规则.这意味着当您传入一个模糊日期字符串时01-05-2013,它会根据美国英语日期约定进行解析.在这种情况下,月份首先即"mm-dd-yyyy".所以结果将始终是1月5日,而不是5月1日.

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

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

        lsDateFormat( myDate, "yyyy-mm-dd", "pt_PT")
Run Code Online (Sandbox Code Playgroud)

边注:

顺便说一下,DateFormat确实期待一个约会对象.但是,与CF中的大多数函数一样,它也足够灵活,可以接受日期字符串.这允许您将其用作惰性快捷方式,以便再次从日期字符串 =>日期对象 => 转换回(格式化)日期字符串.最好使用日期对象(你真的应该验证日期字符串),但这完全是另一个对话......


dun*_*can 5

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

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

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

例如

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

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

<cfset newdateString = DateFormat(dateObject, "yyyy-mm-dd")>
Run Code Online (Sandbox Code Playgroud)

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

<cfset dd = listFirst(originalDateString, "-")>
<cfset mm = listGetAt(originalDateString, 2, "-")>
<cfset yy = listLast(originalDateString, "-")>
Run Code Online (Sandbox Code Playgroud)

  • 不,实际上`dateFormat`也很乐意接受日期字符串.真正的问题是标准日期函数需要美国英语日期字符串,并根据美国英语日期约定(即月份首先)进行解析. (2认同)