Datetime ColdFusion-带GMT偏移量的日期时间格式

Datetime ColdFusion-带GMT偏移量的日期时间格式,datetime,coldfusion,coldfusion-10,datetimeoffset,Datetime,Coldfusion,Coldfusion 10,Datetimeoffset,我正在使用ColdFusion 10进行一些REST调用,返回的日期使用GMT偏移量 示例:2013-03-25T14:30:40-04:00 我需要格式化此文件,用于两个目的: 屏幕显示,使其看起来像mm/dd/yyyy hh:mm:ss 插入mySQL 我尝试了各种CF时间/日期函数,但仍然得到“不是有效的日期格式” 我想也许#ParseDateTime(I.submitted_at,“pop”)#会处理pop,但问题是一样的 现在花了几个小时尝试多种变体,在谷歌上搜索,现在只是兜圈子。任何

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

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

我需要格式化此文件,用于两个目的:

  • 屏幕显示,使其看起来像
    mm/dd/yyyy hh:mm:ss
  • 插入mySQL
  • 我尝试了各种CF时间/日期函数,但仍然得到“不是有效的日期格式”

    我想也许
    #ParseDateTime(I.submitted_at,“pop”)#
    会处理pop,但问题是一样的

    现在花了几个小时尝试多种变体,在谷歌上搜索,现在只是兜圈子。任何想法都将不胜感激


    谢谢

    这个,2013-03-25T14:30:40-04:00,是一个字符串。如果运行此命令:

    x = left(2013-03-25T14:30:40-04:00, 19);
    
    你会得到2013-03-25T14:30:40。可以使用replace函数将T替换为空格。然后你就可以开始了

    DateTimeVar =parsedatetime('2013-03-25 14:30:40');
    

    现在您有了一个可以格式化的datetime变量。如有必要,您可以使用GMT的偏移量执行datediff。

    请查看CFLib上的UDF
    DateConvertISO8601()

    说明:
    此函数获取ISO 8601中保存日期的字符串,并将其转换为ODBC datetime,但可以进行调整以转换为任何您喜欢的格式。它还将通过指定偏移量转换为您选择的时区中的日期时间,也就是说,它可能需要以GMT为单位的日期时间并转换为PT。有关日期和时间表示的国际标准ISO 8601的说明,请参见

    返回值:
    返回日期时间


    源代码可以在我提供的链接上查看。

    对于许多远程请求和响应,日期/时间值通常可以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>
    
    这项功能是由本·纳德尔提供的。可以在以下位置找到原始博客帖子:

    如果需要,还可以使用偏移量转换日期时间值。本·纳德尔(Ben Nadel)再次发表了一篇博文,概述了如何实现这一目标:


    这是一个信息性的回答,不是对问题的直接回答


    ColdFusion 11已更新该函数,以便将ISO-8601日期/时间字符串正确转换为ColdFusion datetime对象。

    CF10可以使用此代码,如示例中所述


    如果我错了,请纠正我的错误,但尽管这似乎有效,但实际上却会产生脏数据。考虑两个日期:“2014-0819T11:0220.633-0700”和“2014-0819T11:0220.633-04:00”。这些日期实际上相隔3小时,但上面的代码将两个日期显示为相同的值:“2014-08-19 11:02:20”。下面的链接文章讨论了时区转换,但实际上只涉及服务器的首选时区;不是日期字符串中的时区偏移量。
    ISOToDateTime( "2013-03-25T14:30:40-04:00" )
    
    <cfset string = "1997-07-16T19:20:30+01:00">
    <cfset date = parseDateTime(string, "yyyy-MM-dd'T'HH:mm:ssX")>