我很好奇是否有人可以向我指出一个强大且记录良好的AS3日期库。具体来说,我喜欢像Java日期格式化程序一样工作(至少在原理上),这样你就可以传入一个特定类型的字符串并获取一个日期对象,然后可以很容易地将其转换为替代使用原生Date对象是一个令人难以置信的PITA,当需要做这样的事情时......我希望我不必从头开始重新发明这个轮子。
TIA
答案 0 :(得分:3)
您可能会从CASA Lib这样的框架中找到有用的一个。这里有例如:http://as3.casalib.org/docs/org_casalib_util_DateUtil.html
还有其他大型图书馆可能会有所帮助,例如AS3CoreLib:https://github.com/mikechambers/as3corelib/blob/master/src/com/adobe/utils/DateUtil.as
答案 1 :(得分:2)
所有常见的事情都不能保证它的运作情况(或完全没有问题)。
它没有任何外部依赖关系。只需创建一个具有匹配名称的.as文件(如果愿意,可以随意重新命名)并前往城镇。
所有的公共职能都在顶部,有一些文件(不完全不言而喻)。
希望它有所帮助...
package {
public class DrDredelDate {
/*
init new date by passing:
a) nothing - an object with the current time will be generated
b) a millisecond string for a specific time
c) a time formatted in one of the following two ways:
2013-01-01 00:00:00 -7:00 -- timzeone is optional, if omitted, date will be created as GMT
or
2012-01-18T23:30:42-08:00 -- timezone non-optional
*/
public function DrDredelDate(inD:String = null) {
if(inD == null ){
d = new Date();
getDateVars(d)
}
else if(inD.replace(/\d+/,"") == ""){
d = new Date(parseInt(inD))
getDateVars(d);
}
else
d = convertFromString(inD);
}
/**
Format using the following control characters:
m = month,
d = day,
yy = 2 digit year,
yyyy = 4 digit year,
h = 24 hour time,
M = minute,
s = second,
t = timezone as digits offset,
c = month abbr,
W = weekday
H = 12hour
a = am/pm
A = AM/PM
T = timezone abbr //if available
*/
public function getFormattedDate(formatString:String):String{
var ret:String = "";
for(var i=0;i<formatString.length; i++){
if(formatString.charAt(i) == 'm'){
if(formatString.substring(i).match(/^mm/)){
ret += addLeadingZero(month);i++;continue;
}ret += month;continue;
}
if(formatString.charAt(i) == 'd'){
if(formatString.substring(i).match(/^dd/)){
ret += addLeadingZero(date);i++;continue;
}ret += date;continue;
}
if(formatString.charAt(i) == 'y'){
if(formatString.substring(i).match(/^yyyy/)){
ret += year;i+=3;continue;
}else if(formatString.substring(i).match(/^yy/)){
ret += (year+"").substring(2,4);i++;continue;
}
}
if(formatString.charAt(i) == 'h'){
if(formatString.substring(i).match(/^hh/)){
ret += addLeadingZero(hours);i++;continue;
}ret += hours;continue;
}
if(formatString.charAt(i) == 'H'){
if(formatString.substring(i).match(/^HH/)){
ret += addLeadingZero(militaryToClockHour());i++;continue;
}ret += militaryToClockHour();continue;
}
if(formatString.charAt(i) == 'a'){
ret += ampm();continue;
}
if(formatString.charAt(i) == 'A'){
ret += AMPM();continue;
}
if(formatString.charAt(i) == 'M'){
if(formatString.substring(i).match(/^MM/)){
ret += addLeadingZero(minutes);i++;continue;
}ret += minutes;continue;
}
if(formatString.charAt(i) == 's'){
if(formatString.substring(i).match(/^ss/)){
ret += addLeadingZero(seconds);i++;continue;
}ret += seconds;continue;
}
if(formatString.charAt(i) == 't'){
ret += timezoneOffset;continue;
}
if(formatString.charAt(i) == 'T'){
ret += timezoneString;continue;
}
if(formatString.charAt(i) == 'c'){
ret += getMonthAbbr();continue;
}
if(formatString.charAt(i) == 'W'){
ret += getWeekday();continue;
}
ret += formatString.charAt(i);
}
return ret;
}
/**
Usage:
Returns a formatted string representation of this Date object converted over into the requested timezone. Note that this has no effect on the underlying date object and the returned value is simply a string representation.
arguments :
format: pass in the same format as you would for the method above for the format param
timeZoneOffset: pass in an abbr or one of the US tZones from mySQL or just a numeric offset representing the hour offset from GMT ie. -5 or +3
*/
public function getShiftedTimezoneFormattedDate(format:String, timeZoneOffset:String = "GMT"):String{
var tzOffset = null;
if( timeZoneOffset.toUpperCase().replace(/[^A-Z]/g,"") == "GMT")
tzOffset = 0;
if( timeZoneOffset.toUpperCase().replace(/[^A-Z]/g,"") == "EST" || timeZoneOffset == "US/Eastern")
tzOffset = -5;
if(timeZoneOffset.toUpperCase().replace(/[^A-Z]/g,"") == "EDT")
tzOffset = -4;
if(timeZoneOffset.toUpperCase().replace(/[^A-Z]/g,"") == "CST" || timeZoneOffset == "US/Central")
tzOffset = -6;
if(timeZoneOffset.toUpperCase().replace(/[^A-Z]/g,"") == "CDT")
tzOffset = -5;
if(timeZoneOffset.toUpperCase().replace(/[^A-Z]/g,"") == "MST" || timeZoneOffset == "US/Mountain")
tzOffset = -7;
if(timeZoneOffset.toUpperCase().replace(/[^A-Z]/g,"") == "MDT")
tzOffset = -6;
if(timeZoneOffset.toUpperCase().replace(/[^A-Z]/g,"") == "PST" || timeZoneOffset == "US/Pacific")
tzOffset = -8;
if(timeZoneOffset.toUpperCase().replace(/[^A-Z]/g,"") == "PDT")
tzOffset = -7;
if(tzOffset == null){
var operator = timeZoneOffset.charAt(0);
tzOffset = parseInt(timeZoneOffset.replace("/:.*/",""));
}
if(isNaN(tzOffset))
return null
tzOffset = tzOffset * 60 * 60 * 1000;
var dTzOffset = -d.timezoneOffset * 60 * 1000;
var newMS = d.getTime() - dTzOffset + tzOffset;
var nDate:Date = new Date(newMS);
return new DrDredelDate(nDate.getTime() + "").getFormattedDate(format);
}
public function isAfterDate(comparisonDate:Date):Boolean{
return(d.time > comparisonDate.time)
}
public function isSameAsDate(comparisonDate:Date):Boolean{
return(d.time == comparisonDate.time)
}
public function getTime(){
return d.time;
}
public function getDate(){
return d;
}
///////////NOTHING TO REALLY LOOK AT BELOW HERE////////////////
public static var PST:String = "PST";
public static var EST:String = "EST";
public static var CST:String = "CST";
public static var MST:String = "MST";
private var d:Date;
public var year,month,monthName,date,weekDay,hours,minutes,seconds,timezoneOffset;
private function getDateVars(d:Date){
this.year = d.fullYear;
this.month = d.month;
this.date = d.date;
this.hours = d.hours;
this.minutes = d.minutes;
this.seconds = d.seconds;
this.timezoneOffset = d.timezoneOffset;
}
private function convertFromString(inD:String):Date{
//2012-10-03 10:15:00 GMT-0800
if(inD.match(/\d{4}\-\d{1,2}\-\d{1,2} \d{1,2}\:\d{1,2}\:\d{1,2}/)){
return timeFromMySqlTimestamp(inD);
}
//2012-01-18T23:30:00-08:00
if(inD.match(/\d{4}\-\d{1,2}\-\d{1,2}T\d{1,2}\:\d{1,2}\:\d{1,2}/)){
return timeFromGenericTimestamp(inD);
}
return null;
}
private var monthAbbr = ['','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
public function getWeekday(){
return d.toString().split(" ")[0];
}
public function getMonthAbbr(){
return d.toString().split(" ")[1];
}
private function timeFromMySqlTimestamp(inD:String):Date{
//2012-10-19 03:15:22 PST
var parts:Array = inD.split(" ");// 0 = date, 1 = hours, 2 = timezone
year = stripLeadingZero(parts[0].split("-")[0]);
month = stripLeadingZero(parts[0].split("-")[1]);
date = stripLeadingZero(parts[0].split("-")[2]);
hours = stripLeadingZero(parts[1].split(":")[0]);
minutes = stripLeadingZero(parts[1].split(":")[1]);
seconds = stripLeadingZero(parts[1].split(":")[2]);
try{
timezoneOffset = getTZFromString(parts[2]);
}catch(e:Error){
timezoneOffset = "GMT-000";
}
return new Date(monthAbbr[month] + " " + date + " " + year + " " + hours + ":" + minutes + ":" + seconds + " " + timezoneOffset);//09 03 2012 23:39:05 GMT-0500
}
private var timezoneString = "";
private function getTZFromString(inStr:String){
if(inStr.toUpperCase().replace(/[^A-Z]/g) == "EST"){timezoneString = "EST"; return "GMT-0500"};
if(inStr.toUpperCase().replace(/[^A-Z]/g) == "EDT"){timezoneString = "EDT"; return "GMT-0400"};
if(inStr.toUpperCase().replace(/[^A-Z]/g) == "CST"){timezoneString = "CST"; return "GMT-0600"};
if(inStr.toUpperCase().replace(/[^A-Z]/g) == "CDT"){timezoneString = "CDT"; return "GMT-0500"};
if(inStr.toUpperCase().replace(/[^A-Z]/g) == "MST"){timezoneString = "MST"; return "GMT-0700"};
if(inStr.toUpperCase().replace(/[^A-Z]/g) == "MDT"){timezoneString = "MDT"; return "GMT-0600"};
if(inStr.toUpperCase().replace(/[^A-Z]/g) == "PST"){timezoneString = "PST"; return "GMT-0800"};
if(inStr.toUpperCase().replace(/[^A-Z]/g) == "PDT"){timezoneString = "PDT"; return "GMT-0700"};
if(inStr.charAt(0) == "-" || inStr.charAt(0) == "+") return "GMT" + inStr;
return inStr;
}
private function timeFromGenericTimestamp(inD:String):Date{
//2012-01-18T23:30:00-08:00
var parts:Array = inD.split("T");// 0 = date, 1 = hours, 2 = timezone
year = stripLeadingZero(parts[0].split("-")[0]);
month = stripLeadingZero(parts[0].split("-")[1]);
date = stripLeadingZero(parts[0].split("-")[2]);
hours = stripLeadingZero(parts[1].split(":")[0]);
minutes = stripLeadingZero(parts[1].split(":")[1]);
var secAndTZ = parts[1].split(":")[2];
var plusMinusTok = (secAndTZ.indexOf("-") != -1)? "-" : "+";
seconds = stripLeadingZero(secAndTZ.split(plusMinusTok)[0]);
timezoneOffset = plusMinusTok + secAndTZ.split(plusMinusTok)[1] + "00";
return new Date(monthAbbr[month] + " " + date + " " + year + " " + hours + ":" + minutes + ":" + seconds + " " + timezoneOffset);//09 03 2012 23:39:05 GMT-0500
}
private function addLeadingZero(inD:Number):String{
return ( inD >= 10) ? inD + "" : "0" + inD;
}
private function stripLeadingZero(inStr:String){
if(inStr.replace(/\d+/,"") != ""){
trace("DrDredelDate: stripLeadingZero: inStr " + inStr + " is non numeric. returning null");
return null;
}
inStr = inStr.replace(/^0+/,"");
if(inStr == "")
return 0;
return parseInt(inStr);
}
private function militaryToClockHour(){
if(hours == 0 || hours == 12)
return 12;
if(hours < 12)return hours;
return hours - 12;
}
private function AMPM(){
return (hours < 12)?"AM":"PM";
}
private function ampm(){
return (hours < 12)?"am":"pm";
}
}
}