package com.utils { /** * @author chris@acleveraddress.com */ public class DateUtils { private static var ts : Date; private static var daysInMonth : Array = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; private static var months : Array = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ]; private static var days : Array = [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ]; public static function date(format : String, timestamp : Date = null) : String { ts = (timestamp == null) ? new Date() : timestamp; var i : uint; var str : String = ''; while (i < format.length) { var c : String = format.charAt(i++); switch(c) { case '\\': case '$': c = format.charAt(i++); break; case 'd': c = string(ts.date); break; case 'D': c = days[ts.day].slice(0,3); break; case 'j': c = ts.date.toString(); break; case 'l': c = days[ts.day]; break; case 'N': c = (ts.day == 0) ? '7' : ts.day.toString(); break; case 'S': c = suffix(ts.date); break; case 'w': c = ts.day.toString(); break; case 'z': c = dayOfYear(ts).toString(); break; case 'W': c = weekOfYear(ts).toString(); break; case 'F': c = months[ts.month]; break; case 'm': c = string(ts.month); break; case 'M': c = months[ts.month].slice(0,3); break; case 'n': c = ts.month.toString(); break; case 't': var j : uint = ((isLeapYear) && (ts.month == 1)) ? 1 : 0; j += daysInMonth[ts.month]; c = j.toString(); break; case 'L': c = (isLeapYear) ? '1' : '0'; break; case 'o': c = String(IsoWeek); break; case 'Y': c = ts.fullYear.toString(); break; case 'y': c = (ts.fullYear%100).toString(); break; case 'a': c = meridiem; break; case 'A': c = meridiem.toUpperCase(); break; case 'B': c = SwatchTime; break; case 'g': c = (ts.hours%12).toString(); break; case 'G': c = (ts.hours).toString(); break; case 'h': c = string(ts.hours%12); break; case 'H': c = string(ts.hours); break; case 'i': c = string(ts.minutes); break; case 's': c = string(ts.seconds); break; case 'u': c = string(ts.milliseconds); break; case 'e': trace("Not supported - AS doesn't give you enough info to do this - use T?"); break; case 'I': c = dst; break; case 'O': c = getTimezone(); break; case 'P': c = getTimezone(true); break; case 'T': c = TimezoneName; break; case 'c': c = ts.getFullYear() + '-' + string(ts.month) + '-' + string(ts.date) + days[ts.day].slice(0,1) + string(ts.hours) + ':' + string(ts.minutes) + ':' + string(ts.seconds) + getTimezone(true); break; case 'r': c = days[ts.day].slice(0,3) + ', ' + ts.date + ' ' + months[ts.month].slice(0,3) + ' ' + ts.getFullYear() + ' ' + string(ts.hours) + ':' + string(ts.minutes) + ':' + string(ts.seconds) + ' ' + getTimezone(); break; case 'U ': c = UnixTimestamp; break; } str += c; } return str; } private static function suffix(i : uint) : String { if (i == 0) return ''; i %= 100; if ((10 < i) && (i < 14)) return 'th'; i %= 10; if (i == 1) return 'st'; if (i == 2) return 'nd'; if (i == 3) return 'rd'; return 'th'; } private static function string(i : uint) : String { var str : String = i.toString(); if (str.length == 1) str = '0' + str; return str; } private static function dayOfYear(d : Date) : uint { var f : Date = new Date( d.getFullYear(), 0, 1 ); var i : Number = d.getTime() - f.getTime(); return Math.floor(i/86400000); } private static function weekOfYear(d:Date) : uint { var f : Number = 2 - new Date(d.getFullYear(), 0, 1).getDay(); if (f < 0) f += 7; var m : Date = new Date(d.getFullYear(), 0, f); var week : Number = Math.floor(Math.floor((d.getTime() - m.getTime()) / 86400000) / 7) + 1; if (week == 0) week = weekOfYear(new Date(d.getFullYear() - 1, 11, 31)); if (week > 52) week -= 52; return week; } private static function get meridiem() : String { return (ts.hours < 12) ? 'am' : 'pm'; } private static function get SwatchTime():String { var i : int = ( ts.getUTCHours() * 3600 ) + ( ts.getUTCMinutes() * 60 ) + ( ts.getUTCSeconds() ) + 3600; return String(Math.round(i/86.4)); } public static function get TimezoneName():String { var timeZones:Array = ['IDLW', 'NT', 'HST', 'AKST', 'PST', 'MST', 'CST', 'EST', 'AST', 'ADT', 'AT', 'WAT', 'GMT', 'CET', 'EET', 'MSK', 'ZP4', 'ZP5', 'ZP6', 'WAST', 'WST', 'JST', 'AEST', 'AEDT', 'NZST']; var hour:Number = Math.round(12 + -(ts.getTimezoneOffset() / 60)); if (dst as Boolean) hour--; return timeZones[hour]; } private static function getTimezone(sep : Boolean = false) : String { var tz:Number = -Math.min( new Date(0, 0, 1).timezoneOffset, new Date(0, 6, 1).timezoneOffset ); var str : String = (tz > 0) ? '+' : '-'; tz = Math.abs(tz); var h : int = Math.floor(tz/60); var m : int = Math.floor(tz%60); str += (sep) ? string(h) + ":" + string(m) : string(h) + string(m); return str; } private static function get isLeapYear() : Boolean { return (ts.fullYear%4 == 0) ? true : false; } private static function get IsoWeek() : uint { var f : Number = 2 - new Date(ts.getFullYear(), 0, 1).getDay(); if (f < 0) f += 7; var m : Date = new Date(ts.getFullYear(), 0, f); var week : Number = Math.floor(Math.floor((ts.getTime() - m.getTime()) / 86400000) / 7) + 1; if (week == 0) return ts.getFullYear() - 1; return ts.getFullYear(); } private static function get UnixTimestamp():String { return string(Math.floor(ts.getTime()/1000)); } private static function get dst() : String { if ( new Date(ts.getFullYear(), ts.month, ts.date).timezoneOffset > new Date(ts.getFullYear(), (ts.month - 6), ts.date).timezoneOffset ) return '1'; return '0'; } } }