日期/时间转换ColdFusion

4
我正在使用一个脚本,以ISO 8601格式显示日期和时间,如下所示:2012-05-17T17:35:44.000Z
但是,当使用#Now()#符号时,我希望它可显示为正常的ColdFusion时间戳格式。该格式如下:{ts '2012-05-17 17:35:44'} 我该如何做到这一点?

哈!我以为标题写的是“混乱”。 - salezica
2
难怪,倒着阅读让你感到困惑 ;) - Leigh
6个回答

5

2
很确定只需要解析然后输出,就可以按照您想要的格式呈现给您:
#parseDateTime(REReplace("2012-05-17T17:35:44.000Z", "(\d{4})-?(\d{2})-?(\d{2})T([\d:]+).*", "\1-\2-\3 \4"))#

编辑:已修复并测试通过。 ;)


哈哈,好多了。ISO日期让我头疼;)顺便说一下,如果你需要时区,请查看这里的“ConvertIsoToDateTime”函数(http://www.bennadel.com/blog/811-Converting-ISO-Date-Time-To-ColdFusion-Date-Time.htm)的注释。 - Leigh

1

从CF2016开始,蒂姆·西尔维斯特的回答如下:

<cfset string = "1997-07-16T19:20:30+01:00">
<cfset date = parseDateTime(string, "yyyy-MM-dd'T'HH:nn:ssX")>

mm掩码已被弃用并替换为nn,在CF10和CF11中不可用。

警告:在CF2016(+ 2018&2021)中,mm掩码的行为也发生了改变,前面的示例将输出{ts'1998-08-16 18:00:30'}


很好知道。虽然我个人认为明确指定掩码更好,但显然现在支持开箱即用,即parseDateTime(string),无需掩码。 - SOS
1
真的。我进行了一些测试:'now' 从CF11开始。 - MLB

1

我认为这是一个更完整和优雅的解决方案:

        <cffunction name="ConvertISOToDateTime" access="private" returntype="date">
    <cfargument name="ISODateString" required="yes" type="string" hint="Properly formed ISO-8601 dateTime String">
    <cfscript>
        // time formats have 2 ways of showing themselves: 1994-11-05T13:15:30Z UTC format OR 1994-11-05T08:15:30-05:00
        local.initial_date = parseDateTime(REReplace(ISODateString, "(\d{4})-?(\d{2})-?(\d{2})T([\d:]+).*", "\1-\2-\3 \4"));
        // If not in UTC format then we need to
        if (right(arguments.ISODateString, 1) neq "Z") {
            local.timeModifier = "";
            //Now we determine if we are adding or deleting the the time modifier.
            if (ISODateString contains '+' and listlen(listrest(ISODateString,"+"),":") eq 2){
                local.timeModifier = listrest(ISODateString,"+");
                local.multiplier = 1; // Add
            } else if (listlen(listlast(ISODateString,"-"),":") eq 2) {
                local.timeModifier = listlast(ISODateString,"-");
                local.multiplier = -1; // Delete
            }
            if (len(local.timeModifier)){
                local.initial_date = dateAdd("h", val(listfirst(local.timeModifier,":"))*local.multiplier,local.initial_date);
                local.initial_date =  dateAdd("m", val(listlast(local.timeModifier,":"))*local.multiplier,local.initial_date);
            }
        }
        return local.initial_date;
    </cfscript>
</cffunction>

0

那个日期字符串是ISO格式的,这里有一个很好的例子可以将其转换为CF日期对象在这里

...
<cfreturn ARGUMENTS.Date.ReplaceFirst(
    "^.*?(\d{4})-?(\d{2})-?(\d{2})T([\d:]+).*$",
    "$1-$2-$3 $4"
    ) />

3
只回答链接并不是一个好的回答。请至少提供一份可在链接中找到的摘要。另请参阅:http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers - ale

0
使用createOdbcDate函数。最好在查询中进行比较。
<cfquery name="GetVisits" >
    SELECT v.ExecutiveID, eu.firstname, eu.lastname from Visits where
v.visitDate between #CreateODBCDate(DateFrom)#
        AND  #CreateODBCDate(DateTo)#
</cfquery>

2
CreateODBCDate无法解析字符串2012-05-17T17:35:44.000Z。更不用说它只返回日期而不是日期时间 {ts'2012-05-17 17:35:44'}。 - Leigh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接