2013-03-27 127 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")> 
相關問題