我使用ColdFusion 10进行一些REST调用,返回的日期使用GMT偏移量。
示例:2013-03-25T14:30:40-04:00
我需要将其格式化为2个目的:
mm/dd/yyyy hh:mm:ss
我尝试了各种CF时间/日期功能,但继续得到“不是有效的日期格式”
我想也许#ParseDateTime(i.submitted_at,"pop")#
会用POP处理它,但同样的问题。
现在花了几个小时尝试多种变化,然后用Google搜索,只是绕圈子。任何想法都将不胜感激。
谢谢!
答案 0 :(得分:4)
查看CFLib上的UDF DateConvertISO8601()
。
DateConvertISO8601(ISO8601dateString, targetZoneOffset) on CFLib
说明强>
此函数采用一个字符串,该字符串在ISO 8601中保存日期并将其转换为ODBC日期时间,但可以调整为转换为您喜欢的任何内容。它还将通过指定偏移量转换为您选择的时区中的日期时间,即它可能需要GMT中的日期时间并转换为PT。有关日期和时间表示的国际标准ISO 8601的说明,请参阅http://www.w3.org/TR/NOTE-datetime。返回值
返回日期时间。
源代码可在我提供的链接中查看。
答案 1 :(得分:3)
这是2013-03-25T14:30:40-04:00,是一个字符串。如果你运行这个:
x = left(2013-03-25T14:30:40-04:00, 19);
你得到2013-03-25T14:30:40。您可以使用替换功能将T替换为空格。然后你可以到这个
DateTimeVar =parsedatetime('2013-03-25 14:30:40');
现在您有一个可以格式化的日期时间变量。如有必要,您可以使用GMT的偏移量进行约会。
答案 2 :(得分:2)
通过许多远程请求和响应,日期/时间值通常可以ISO格式返回。在您的情况下,掩码看起来像这样:
YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)
在这种ISO格式中,T字符串是标记的文字表示,其中时间戳在字符串中开始(直接跟随偏移量)。
下面是一个可重用的函数,它将ISO日期格式转换为可用的ColdFusion日期时间对象:
<cffunction name="ISOToDateTime" access="public" returntype="string" output="false"
hint="Converts an ISO 8601 date/time stamp with optional dashes to a ColdFusion
date/time stamp.">
<cfargument name="Date" type="string" required="true" hint="ISO 8601 date/time stamp." />
<cfreturn ARGUMENTS.Date.ReplaceFirst(
"^.*?(\d{4})-?(\d{2})-?(\d{2})T([\d:]+).*$",
"$1-$2-$3 $4"
) />
</cffunction>
然后你可以像这样调用函数来输出或返回一个ColdFusion友好版本的日期时间:
ISOToDateTime( "2013-03-25T14:30:40-04:00" )
这个功能是由Ben Nadel提供的。原始博文可以在这里找到:
http://www.bennadel.com/blog/811-Converting-ISO-Date-Time-To-ColdFusion-Date-Time.htm
如果需要,您还可以使用偏移量转换日期时间值。同样,Ben Nadel有一篇很棒的博客文章,概述了如何实现这一目标:
答案 3 :(得分:2)
这是一个信息性的答案,而不是对问题的直接回答。
ColdFusion 11更新了ParseDateTime()函数,以便将ISO-8601日期/时间字符串正确转换为ColdFusion日期时间对象。
答案 4 :(得分:1)
CF10可以使用parseDateTime() doc。
示例中所述的代码<cfset string = "1997-07-16T19:20:30+01:00">
<cfset date = parseDateTime(string, "yyyy-MM-dd'T'HH:mm:ssX")>