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

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線上文件