驚艷於一個相容於ColdFusion,但是可免費商用的Railo,跌跌撞撞的研究過程,希望能有同好一起交流指教。

2011年6月27日 星期一

ColdFusion常用字串函數

Asc 傳回該字元或是字串第一位字元之ASCII Code值。
  Asc("0") = 48
  Asc("A") = 65
  Asc("Apple") = 65

Chr 根據所輸入之ASCII Code值(需介於0 – 255),傳回對應之字元。
  Chr(65) = "A"
  Chr(Asc("A")) = "A"

CJustify 將原字串內容依新的字串長度予以置中對齊。
  CJustify("Center", 10) = " Center "

Compare 依據ASCII Code值比較兩個字串大小(大小寫有差別),第一字串大於第二字串,傳回1
第一字串等於第二字串,傳回0
第一字串小於第二字串,傳回-1
  Compare("coo", "Coo") = 1
  Compare("Abc", "Abc") = 0
  Compare("coo", "koo") = -1

CompareNocase 依據ASCII Code值比較兩個字串大小(大小寫沒有差別),傳回值同Compare。
  CompareNocase("boo", "Boo") = 0
  CompareNocase("boo", "foo") = -1

Find 找尋子字串是否包含於母字串中(大小寫有差別),並可設定母字串搜尋起始位置。若包含於母字串中,則傳回母字串中第一位相同字元之位置,反之,則傳回0。
  Find("idf", "Abcidfgh", 1) = 4
  Find("idg", "Abcidfgh", 1) = 0

FindNoCase 找尋子字串是否包含於母字串中(大小寫沒有差別),其他同Find。
  Find("IDF", "Abcidfgh", 1) = 4
  Find("idg", "Abcidfgh", 1) = 0

FindOneOf 找尋子字串集合中之任一字元是否存在於母字串(大小寫有差別),若存在則傳回母字串中第一個相同字元之位置,反之,則回傳0。
  FindOneOf("ghd", "abcdefghijk", 1) = 4
  FindOneOf("GhD", "abcdefghijk", 1) = 8

Insert 將子字串插入母字串所指定的位置當中。
  Insert("abc", "123456789", 4) = "1234abc56789"
  Insert("abc", "123456789", 0) = "abc123456789"

LCase 將字串中之英文字母轉換成小寫。
  LCase("ColdFusion") = "coldfusion"
  LCase("ABCD1234") = "abcd1234"

Left 從母字串之起始位置取出子字串。
  Left("ColdFusion", 4) = "Cold"
  Left("ColdFusion", 20) = "ColdFusion"

Len 傳回字串長度。
  Len("ColdFusion") = 10
  Len("Cold" & "Fusion") = 10
  Len("") = 0

LJustify 將原字串內容依新的字串長度予以置左對齊。
  LJustify("Left", 10) = "Left "

LTrim 去除字串中左邊的空格。
  LTrim(" Leetide ") = "Leetide "

Mid 從母字串中取出子字串。
  Mid("Dictionary", 3, 4) = "ctio"
  Mid("Dictionary", 1, 15) = "Dictionary"

RemoveChars 移除字串中字元。
  RemoveChars("ColdFusion", 3, 4) = "Cosion"
  RemoveChars("ColdFusion", 3, 15) = "Co"

RepeatString 複製字串於原字串當中。
  RepeatString ("ColdFusion", 2) = "ColdFusionColdFusion"
  RepeatString ("ColdFusion", 0) = ""

Replace 取代字串中之特定字元(大小寫有差別)。
  Replace("CACACA", "C", "Q") = "QACACA"
  Replace("CACACA", "C", "Q", "ONE") = "QACACA"
  Replace("CACACA", "C", "Q", "ALL") = "QAQAQA"
  預設值為"ONE"

ReplaceList 取代字串中之特定字元列(大小寫有差別)。
  ReplaceList("CABARET", "CA,BA,T", "SA,DA,K") = "SADAREK"
  ReplaceList("CABARET", "CA,BA,T", "TA,DA,K") = "KADAREK" ,其中"CA"先被轉換成"TA",但隨後的"T"又被轉換成"K",故"CA"最終將轉換成"KA",此為Recursive之用法。

ReplaceNoCase 取代字串中之特定字元(大小寫沒有差別)。
  Replace("cacaca", "C", "B") = "Bacaca"
  Replace("CACACA", "c", "b", "ONE") = "bACACA"
  Replace("CACACA", "C", "b", "ALL") = "bAbAbA"
  預設值為"ONE"

Reverse 反置字串內容。
  Reverse("ABCD") = "DCBA"
  Replace("CACACA", "c", "b", "ONE") = "bACACA"

Right從母字串之最後一位字元取出子字串。
  Right("ColdFusion", 6) = "Fusion"
  Right("ColdFusion", 20) = "ColdFusion"

RJustify 將原字串內容依新的字串長度予以置右對齊。
  RJustify("Right", 10) = " Right"

RTrim 去除字串中右邊的空格。
  RTrim(" Leetide ") = " Leetide"

SpanExcluding 從字串起始位置依序取出字元,直到有相同特定字元時才停止(大小寫有差別)。
  SpanExcluding ("I am happy", "h") = "I am "
  SpanExcluding("Book", "b") = "Book"

SpanIncluding 從字串起始位置依序取出字元,直到沒有相同特定字元時才停止(大小寫有差別)。
  SpanExcluding ("Sensitivity", "eStinsvy") = "Sensitivity"
  SpanExcluding ("Sensitivity", "eStin") = "Sen"

Trim 去除字串中左邊與右邊的空格。
  Trim(" Leetide ") = "Leetide"
  Trim(" baby face ") = "baby face"

UCase 將字串中之英文字母轉換成大寫。
  UCase("ColdFusion") = "COLDFUSION"
  UCase("Yankee") = "YANKEE"

Val 將字串轉換成數字,若無法轉換則傳回0。
  Val("1290") = 1290
  Val("Ghost") = 0
  Val("66Ghost") = 66


更多字串函數,可參考Adobe線上文件

2011年1月7日 星期五

ColdFusion函數應用 - 找特定日期

在實務操作中, 如:統計, 常會有需要找到某一個特定日期, 如第一天/最後一天, 我們可以利用ColdFusion中已有的函數快速找到該日期.

假設有個初始日期

<cfset yourdate = "2011-01-18">

- 常見於now()或是由資料庫中抓出的日期欄位值

找上週的第一天 (週日)

<CFSET preWeekFirstday = #dateadd("d",-(DayOfWeek(yourdate)+6),yourDate)#>


找上週的最後一天(週六)

<CFSET preWeekEndday = #dateadd("d",-DayOfWeek(yourdate),yourDate)#>


找當週的第一天 (週日)

<CFSET weekFirstday = #dateadd("d",-(DayOfWeek(yourdate)-1),yourDate)#>


找當週的最後一天(週六)

<CFSET weekEndday = #dateadd("d",7-DayOfWeek(yourdate),yourDate)#>


找下週的第一天 (週日)

<CFSET nextWeekFirstday = #dateadd("d",7-(DayOfWeek(yourdate)-1),yourDate)#>


找下週的最後一天(週六)

<CFSET nextWeekEndday = #dateadd("d",14-DayOfWeek(yourdate),yourDate)#>


找某週次的第一天 (週日)

<CFSET weekNum = 5> <!--- 假設要找第五週的資料 --->
<CFSET yearFday = year(yourdate)&"-1-1"> <!--- 該年第一天 --->
<CFSET xFirstday = #dateadd("d",fix((1-DayOfWeek(yearFday))+(weekNum-1)*7),yearFday)#>


找某週次的最後一天(週六)

<CFSET xEndday = #dateadd("d",fix((7-DayOfWeek(yearFday))+(weekNum-1)*7),yearFday)#>




完整程式碼參考:


<!--- 設定初始日期 --->
<cfset yourDate = "2011-01-18">

<!--- 找上週的第一天(週日) --->
<CFSET preWeekFirstday = #dateadd("d",-(DayOfWeek(yourdate)+6),yourDate)#>

<!--- 找上週的最後一天(週六) --->
<CFSET preWeekEndday = #dateadd("d",-DayOfWeek(yourdate),yourDate)#>

<!--- 找當週的第一天(週日) --->
<CFSET weekFirstday = #dateadd("d",-(DayOfWeek(yourdate)-1),yourDate)#>

<!--- 找當週的最後一天(週六) --->
<CFSET weekEndday = #dateadd("d",7-DayOfWeek(yourdate),yourDate)#>

<!--- 找下週的第一天(週日) --->
<CFSET nextWeekFirstday = #dateadd("d",7-(DayOfWeek(yourdate)-1),yourDate)#>

<!--- 找下週的最後一天(週六) --->
<CFSET nextWeekEndday = #dateadd("d",14-DayOfWeek(yourdate),yourDate)#>

<!--- 找該年某週次的第一天(週日) --->
<CFSET weekNum = 5> <!--- 假設要找第五週的資料 --->
<CFSET yearFday = year(yourdate)&"-1-1"> <!--- 該年第一天 --->
<CFSET xFirstday = #dateadd("d",fix((1-DayOfWeek(yearFday))+(weekNum-1)*7),yearFday)#>

<!--- 找該年某週次的最後一天(週六) --->
<CFSET xEndday = #dateadd("d",fix((7-DayOfWeek(yearFday))+(weekNum-1)*7),yearFday)#>

<!--- 找當週週次 --->
<CFSET yourWeek = week(yourdate)>


<!--- 結果輸出 --->
初 始 日 期:#DateFormat(yourdate, "YYYY/MM/DD")# <hr>
上週的第一天 (週日):#DateFormat(preWeekFirstday, "YYYY/MM/DD")# <Br>
上週的最後一天(週六):#DateFormat(preWeekEndday, "YYYY/MM/DD")# <Br><Br>
當週的第一天 (週日):#DateFormat(weekFirstday, "YYYY/MM/DD")# <Br>
當週的最後一天(週六):#DateFormat(weekEndday, "YYYY/MM/DD")# <Br><Br>
下週的第一天 (週日):#DateFormat(nextWeekFirstday, "YYYY/MM/DD")# <Br>
下週的最後一天(週六):#DateFormat(nextWeekEndday, "YYYY/MM/DD")# <Br><Br>
第#weekNum#週的第一天 (週日):#DateFormat(xFirstday, "YYYY/MM/DD")# <Br>
第#weekNum#週的最後一天(週六):#DateFormat(xEndday, "YYYY/MM/DD")# <Br><Br>
當 週 週 次:#yourWeek# <Br>


輸出結果:

ColdFusion時間函數: 常用基本時間(日期)函數

建立時間變數:
‧Now() = {ts '2011-01-07 12:30:13'}
‧CreateDate(2011, 5, 1) = {ts '2011-05-01 00:00:00'}
‧CreateTime(1, 2, 3) = {ts '1899-12-30 01:02:03'}
‧CreateDateTime(2011,5,1,1,2,3) = {ts'2011-05-01 01:02:03'}
‧CreateODBCDate(now()) = {d '2011-02-01'}
‧CreateODBCTime('2011-1-2 03:04:05') = {t '03:04:05'}
‧CreateODBCDateTime(now()) = {ts '2011-02-01 16:23:02'}
‧ParseDateTime(‘2011-1-2 3:4:5') = {ts'2011-01-02 03:04:05'}
(將字串改成時間物件,括弧中可再加第二個變數’POP’代表格林威治時間,中間須用逗號相隔)

秀出時間變數
‧DateFormat(Now(), 'yyyy/mm/dd') = 2011/01/02
第一個變數須為時間變數,第二個變數可以任意參差d日期小於10者前面不補0、dd日期小於10者前面補0、ddd以英文簡寫顯示日期如Mon表星期一、dddd以英文全名顯示日期如Monday表星期一、m 月份小於10者前面不補0、Mm 月份小於10者前面補0、mmm以英文簡寫顯示月份如Feb表二月、mmmm以英文全名顯示月份如February表二月、y年份小於10者前面不補0、yy年份小於100者前面不補0、yyyy年份以四位數字顯示)
‧TimeFormat(Now(), 'HH:mm:sstt') = 03:04:05AM
第一個變數須為時間變數,第二個變數可以任意參差12小時制的h時數小於10者前面不補0、12小時制的hh日期小於10者前面補0、24小時制的H時數小於10者前面不補0、24小時制的HH時數小於10者前面補0、m分鐘小於10者前面不補0、mm時數小於10者前面補0、s秒數小於10者前面不補0、ss秒數小於10者前面補0、t秀出A或P代表上午或下午、tt秀出AM或PM代表上午或下午)

時間加減
‧DateAdd('d','2011-2-2','5') = {ts'2011-01-28 0:0:0'}
(加-5天,其中第一個參數可使用:yyyy年、q季、m月、y年中的天數、d天、w星期的天數、ww週數、h小時數、n分鐘數和s秒數)
‧DateDiff('d', '2011-2-2','2011-2-3') = 1(兩個日期相差天數,其中第一個參數可使用:yyyy年、q季、m月、y年中的天數、d天、w星期的天數、ww週數、h小時數、n分鐘數和s秒數)
‧DatePart('d', '2011-1-2') = 2(傳回時間變數中的日期,其中第一個參數可使用:yyyy年、q季、m月、y年中的天數、d天、w星期的天數、ww週數、h小時數、n分鐘數和s秒數)
‧DateCompare('2011-1-2', '2011-1-5') = -1(比較兩個日期誰先誰後,結果以-1和+1表示)
‧CreateTimeSpan(1,1,1,1) = 1.04237268519(將日期以浮點數表示,單位是天,四個參數依序是天數、小時、分鐘和秒鐘)

抓取時間變數值:
‧Year(Now()) = 2011(取年份數值)
‧Month('2011-5-1') = 5(取月份數值)
‧Day('2011-1-2 03:04:05') = 2 (該月份的2號)
‧Hour('2011-1-2 03:04:05') = 3 (取小時數值)
‧Minute('03:04:05') = 4 (取分鐘數值)
‧Second('2011-1-2 03:04:05') = 5(取秒鐘數值)

時間排序值:
‧Quarter('2011-2-2 03:04:05') = 1(本年度的第一季)
‧DayOfWeek('2011-1-7 03:04:05') = 6 (該星期的第7天)
‧MonthAsString(8) = August (本年度第8月是August)
‧DayOfWeekAsString('1') = Sunday (1~7代表週日到週六)
‧Week('2011-2-15') (本年度的第8週)
‧DayOfYear('2011-2-2 03:04:05') = 33(本年度的第33天)
‧FirstDayOfMonth(now()) =32(本月初1是本年度第32天)

其他:
‧DaysInYear('2011-2-2 03:04:05') = 356 (本年度有365天)
‧DaysInMonth('2011-2-2 03:04:05') = 28 (本月份的天數)
‧IsNumericDate(now()) =YES(判別是否為有效的數值時間)
‧IsDate('2011-2-31') = NO(判別是否為有效的字串時間)
‧IsLeapYear(Now()) = YES (是否為閏年)

更多時間函數,可參考Adobe線上文件