2013-03-27 52 views
2

我正在使用ColdFusion 10进行一些REST调用,并且返回的日期是使用GMT偏移量。ColdFusion - 格林尼治标准时间格式与GMT偏移量

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

我需要这个格式化2个用途:

  1. 屏幕显示,所以它看起来像mm/dd/yyyy hh:mm:ss
  2. 插入到MySQL的。

我已经试过了各种的CF时间/日期的功能,但继续得到“不是一个有效的日期格式”

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

花了几个小时,现在尝试多种变化和周围的Googling现在只是兜兜。任何想法将不胜感激。

谢谢!

回答

4

看一看上CFLib的UDF DateConvertISO8601()

DateConvertISO8601(ISO8601dateString, targetZoneOffset) on CFLib

说明:
此功能需要保持在ISO 8601的日期,并将其转换为ODBC日期时间,但可以适用于转换成任何你喜欢的字符串。它还会通过指定偏移量将其转换为您选择的时区中的日期时间,即可能需要格林威治标准时间的日期时间并转换为PT。关于日期和时间表示的国际标准ISO 8601的描述见http://www.w3.org/TR/NOTE-datetime

返回值:
返回日期时间。

的源代码是在我提供的链接可见。

3

This,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

随着多个远程请求和响应,所述日期/时间值通常可以在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

你也可以转换使用,如果需要的偏移量,日期时间值。此外,本纳德尔有一个伟大的博客文章概述了如何做到这一点:

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

+0

请纠正我,如果我错了,但虽然这似乎工作,它实际上给肮脏的数据。考虑两个日期:“2014-08-19T11:02:20.633-07:00”和“2014-08-19T11:02:20.633-04:00”。这些日期实际上相隔3小时,但上面的代码显示两个日期的值相同:“2014-08-19 11:02:20”。以下链接文章讨论了时区转换,但实际上只处理服务器的首选时区;而不是日期字符串中的时区偏移量。 – Nicholas 2014-12-23 21:11:47

2

这是一个信息的答案,没有直接回答这个问题。

ColdFusion 11已更新ParseDateTime()函数,以便它能够将ISO-8601日期/时间字符串正确转换为ColdFusion日期时间对象。

1

CF10可以使用此代码,如parseDateTime() doc的示例中所述。

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