ColdFusion - 具有GMT偏移的DateTime格式

时间:2013-03-27 12:26:24

标签: datetime coldfusion coldfusion-10 datetimeoffset

我使用ColdFusion 10进行一些REST调用,返回的日期使用GMT偏移量。

示例:2013-03-25T14:30:40-04:00

我需要将其格式化为2个目的:

  1. 屏幕显示,看起来像mm/dd/yyyy hh:mm:ss
  2. 插入mySQL。
  3. 我尝试了各种CF时间/日期功能,但继续得到“不是有效的日期格式”

    我想也许#ParseDateTime(i.submitted_at,"pop")#会用POP处理它,但同样的问题。

    现在花了几个小时尝试多种变化,然后用Google搜索,只是绕圈子。任何想法都将不胜感激。

    谢谢!

5 个答案:

答案 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有一篇很棒的博客文章,概述了如何实现这一目标:

http://www.bennadel.com/blog/1595-Converting-To-GMT-And-From-GMT-In-ColdFusion-For-Use-With-HTTP-Time-Stamps.htm

答案 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")>