Formatting ColdFusion Dates with AS3

I rarely enjoy programming ColdFusion, but have worked around it for quite some time. To make things a bit easier when communicating with ColdFusion-based dates and timestamps, I wrote two AS3 classes that I’d like to share:

CF Timestamp to AS3 Date

This function will take a ColdFusion formatted timestamp (i.e. {ts ‘2009-04-29 15:59:36.11′}) and return an AS3 Date Object.

package com.qnotemedia.utils
{
	public class CFtimestamp
	{
		public static function toDate(rawCFtimestamp:String):Date {
			var date:String = rawCFtimestamp.split("'")[1].split(" ")[0];
			var time:String = rawCFtimestamp.split("'")[1].split(" ")[1].split("'")[0];
			var year:uint = date.split("-")[0];
			var month:uint = date.split("-")[1] - 1;
			var day:uint = date.split("-")[2];
			var hour:uint = time.split(":")[0];
			var minute:uint = time.split(":")[1];
			var second:uint = time.split(":")[2].split(".")[0];
			var millisecond:uint = time.split(":")[2].split(".")[2];
			return new Date(year,month,day,hour,minute,second,millisecond);
		}
	}
}

Using it is quite simple:

var myCFtimestamp = "{ts '2009-04-29 15:59:36.11'}";
var as3Date = CFtimestamp.toDate(myCFtimestamp);

AS3 Date formatted with ColdFusion’s DateFormat function

Another useful function. It takes an AS3 Date Object and returns a string, where the masking syntax is based on ColdFusion’s DateFormat() function.

Note that short, medium, long, and full are included.

package com.qnotemedia.utils {
	public class DateFormatter {
		private static var monthNames:Array = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
		private static var dayNames:Array = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");

		private static var monthAbbrs:Array = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec");
		private static var dayAbbrs:Array = new Array("Sun","Mon","Tues","Wed","Thurs","Fri","Sat");

		public static function monthByName(num:uint):String {
			return monthNames[num];
		}
		public static function monthByAbbr(num:uint):String {
			return monthAbbrs[num];
		}
		public static function dayByName(num:uint):String {
			return dayNames[num];
		}
		public static function dayByAbbr(num:uint):String {
			return dayAbbrs[num];
		}
		public static function includeZero(num:uint):String {
			var numStr:String = num.toString();
			if (num > -1 && num < 10) {
				numStr = "0" + numStr;
			}
			return numStr;
		}

		public static function toCFdateString(dt:Date,msk:String):String {
			// d: Day of the month as digits; no leading zero for single-digit days.
			// dd: Day of the month as digits; leading zero for single-digit days.
			// ddd: Day of the week as a three-letter abbreviation.
			// dddd: Day of the week as its full name.
			// m: Month as digits; no leading zero for single-digit months.
			// mm: Month as digits; leading zero for single-digit months.
			// mmm: Month as a three-letter abbreviation.
			// mmmm: Month as its full name.
			// yy: Year as last two digits; leading zero for years less than 10.
			// yyyy: Year represented by four digits.

			// The following masks tell how to format the full date and cannot be combined with other masks:
			// short: equivalent to m/d/y
			// medium: equivalent to mmm d, yyyy
			// long: equivalent to mmmm d, yyyy
			// full: equivalent to dddd, mmmm d, yyyy

			switch (msk) {
				case "short":
					msk = "m/d/yy";
					break;
				case "medium":
					msk = "mmm d, yyyy";
					break;
				case "long":
					msk = "mmmm d, yyyy";
					break;
				case "full":
					msk = "dddd, mmmm d, yyyy";
					break;
			}

			var returnedString:String = "";
			var currChar:String = "";
			var currIndex:uint = 0;
			var arMSK:Array = new Array();
			for (var i:uint=0; i < msk.length; i++) {
				var char:String = msk.charAt(i);
				if (char == currChar) {
					arMSK[currIndex] = arMSK[currIndex] + char;
				} else {
					currIndex += 1;
					currChar = char;
					arMSK[currIndex] = currChar;
				}
			}
			for (var j:uint=0; j < arMSK.length; j++) {
				var mskItem:* = (arMSK[j] == undefined) ? "" : arMSK[j];
				switch (mskItem) {
					case "dddd":
						mskItem = dayByName(dt.getDay());
						break;
					case "mmmm":
						mskItem = monthByName(dt.getMonth());
						break;
					case "yyyy":
						mskItem = dt.getFullYear();
						break;
					case "ddd":
						mskItem = dayByAbbr(dt.getDay());
						break;
					case "mmm":
						mskItem = monthByAbbr(dt.getMonth());
						break;
					case "dd":
						mskItem = includeZero(dt.getDate());
						break;
					case "mm":
						mskItem = includeZero(dt.getMonth()+1);
						break;
					case "yy":
						mskItem = dt.getFullYear().toString().slice(2,4);
						break;
					case "d":
						mskItem = dt.getDate();
						break;
					case "m":
						mskItem = dt.getMonth()+1;
						break;
					case "y":
						mskItem = dt.getFullYear().toString().slice(2,4); // same as "yy"
						break;
				}
				arMSK[j] = mskItem;
			}

			return arMSK.join("");
		}
	}
}

Again - easy to use:

var myAS3date:Date = new Date(2009,3,29,15,59,36,11);
var myAs3dateFormatted:String = DateFormatter.toCFdateString(myAS3date,"mm dd, yyyy")

Or combine them both!:

var myCFtimestamp = "{ts '2009-04-29 15:59:36.11'}";
var myAs3dateFormatted:String = DateFormatter.toCFdateString(CFtimestamp.toDate(myCFtimestamp),"mm dd, yyyy")