我正在使用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 )任何有关错误的帮助或指导都将受到高度赞赏。
答案 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等)变成日期对象。
为此,我建议使用ParseDateTime或LSParseDateTime和/或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, "-")>