3

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

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

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

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

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

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

任何有关错误的帮助或指导将不胜感激。

4

2 回答 2

8

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

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

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

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

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

边注:

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

于 2013-05-15T15:34:39.460 回答
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")>

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

<cfset dd = listFirst(originalDateString, "-")>
<cfset mm = listGetAt(originalDateString, 2, "-")>
<cfset yy = listLast(originalDateString, "-")>
于 2013-05-15T05:38:39.807 回答