`
hoodng
  • 浏览: 19940 次
社区版块
存档分类
最新评论

贴一份完整的DateFormat代码

阅读更多

好长时间没有来ITeYe, 回顾上一篇文章时,觉得有必要配合上一篇文章《Javascript日期的Format与Parse》把完整的代码贴出来,也算代表自己没有继续潜水。

 

$package("js.text");

$import("js.text.Format");
$import("js.util.LinkedList");

js.text.SimpleDateFormat = function(pattern, DateFormatSymbols){
    
    var CLASS = js.text.SimpleDateFormat, thi$ = CLASS.prototype;
    if(CLASS.__defined__){
        this._init.apply(this, arguments);
        return;
    }
    CLASS.__defined__ = true;
    
    var Class = js.lang.Class, System = J$VM.System;

    var TOKEN = /yy(?:yy)?|M{1,}|d{1,2}|E{1,}|([Hhms])\1?|S(?:SS)?|[azZG]|"[^"]*"|'[^']*'/g;
    
    var Regx = {
        yy : "(\\d{2})", yyyy : "(\\d{4})", G : "(\\S+)",
        M  : "([1-9]|1[012])", MM : "(0[1-9]|1[012])",
        MMM : "(\\S+)", MMMM : "(\\S+)",
        d : "([1-9]|[12][0-9]|3[01])", dd : "(0[1-9]|[12][0-9]|3[01])",
        E : "(\\S+)", EE : "(\\S+)", EEE : "(\\S+)", EEEE : "(\\S+)",
        H : "([0-9]|1[0-9]|2[0-3])", HH : "(0[0-9]|1[0-9]|2[0-3])",
        h : "([1-9]|1[012])", hh : "(0[1-9]|1[012])", a : "(\\S+)",
        m : "([0-9]|[1-5][0-9])", mm : "([0-5][0-9])",
        s : "([0-9]|[1-5][0-9])", ss : "([0-5][0-9])",
        S : "(\\d{1,3})", SSS : "(\\d{3})",
        z : "(\\S+)", Z : "([\\-\\+]\\d{2,4})"
    };
    
    var Getter = new function(){
        var _pad  = function(val, len){val = "000"+String(val); return val.slice(val.length - (len || 2)); };
        var _week = function(D,$,b){return b ? D.getUTCDay() : D.getDay();};
        this.yy   = function(D,$,b){return _pad(this.yyyy(D,$,b), 2);};
        this.yyyy = function(D,$,b){return _pad((b ? D.getUTCFullYear() : D.getFullYear()), 4);};
        this.M    = function(D,$,b){return ( b ? D.getUTCMonth() : D.getMonth())+1;};
        this.MM   = function(D,$,b){return _pad(this.M(D,$,b), 2);};
        this.MMM  = function(D,$,b){return $.getShortMonths()[this.M(D,$,b) - 1];};
        this.MMMM = function(D,$,b){return $.getMonths()[this.M(D,$,b) - 1];};
        this.d    = function(D,$,b){return b ? D.getUTCDate() : D.getDate();};
        this.dd   = function(D,$,b){return _pad(this.d(D,$,b), 2);};
        this.E    = function(D,$,b){return $.getShortWeekdays()[_week(D,$,b)];};
        this.EE   = function(D,$,b){return $.getShortWeekdays()[_week(D,$,b)];};
        this.EEE  = function(D,$,b){return $.getShortWeekdays()[_week(D,$,b)];};
        this.EEEE = function(D,$,b){return $.getWeekdays()[_week(D,$,b)];};
        this.H    = function(D,$,b){return b ? D.getUTCHours() : D.getHours();};
        this.HH   = function(D,$,b){return _pad(this.H(D,$,b), 2);};
        this.h    = function(D,$,b){return this.H(D,$,b) % 12 || 12;};
        this.hh   = function(D,$,b){return _pad(this.h(D,$,b), 2);};
        this.m    = function(D,$,b){return b ? D.getUTCMinutes() : D.getMinutes();};
        this.mm   = function(D,$,b){return _pad(this.m(D,$,b), 2);};
        this.s    = function(D,$,b){return b ? D.getUTCSeconds() : D.getSeconds();};
        this.ss   = function(D,$,b){return _pad(this.s(D,$,b));};
        this.S    = function(D,$,b){return b ? D.getUTCMilliseconds() : D.getMilliseconds();};
        this.SSS  = function(D,$,b){return _pad(this.S(D,$,b), 3);};
        this.a    = function(D,$,b){return $.getAmPmStrings()[this.H(D,$,b) < 12 ? 0:1];};
        this.G    = function(D,$,b){return $.getEras()[parseInt(this.yyyy(D,$,b),10) < 0 ? 0:1];};
        this.z    = function(D,$,b){return b ? "UTC" : (String(D).match(js.text.SimpleDateFormat.TIMEZONE) || [""]).pop().replace(/[^-+\dA-Z]/g, "");};
        this.Z    = function(D,$,b){var o = D.getTimezoneOffset(), ao = Math.abs(o);return (o > 0 ? "-" : "+") + _pad(Math.floor(ao/60)*100 + ao%60, 4);};
    };

    var Setter = new function(){
        this.yy   = function(D,v,$,b){return this.yyyy(D,v,$,b);};
        this.yyyy = function(D,v,$,b){var y = parseInt(v, 10); D.y = (y > 0 && D.bc) ? 0-y : y; b ? D.setUTCFullYear(D.y) : D.setFullYear(D.y); return D;};
        this.M    = function(D,v,$,b){var M = parseInt(v, 10)-1; b ? D.setUTCMonth(M) : D.setMonth(M); return D;};
        this.MM   = function(D,v,$,b){return this.M(D,v,$,b);};
        this.MMM  = function(D,v,$,b){var i = $.getShortMonths().indexOf(v); return i !=-1 ? this.M(D,i+1,$,b) : D;};
        this.MMMM = function(D,v,$,b){var i = $.getMonths().indexOf(v); return i !=-1 ? this.M(D,i+1,$,b) : D;};
        this.d    = function(D,v,$,b){var d = parseInt(v,10); b ? D.setUTCDate(d) : D.setDate(d); return D;};
        this.dd   = function(D,v,$,b){return this.d(D,v,$,b);};
        this.E    = function(D,v,$,b){return D;};
        this.EE   = function(D,v,$,b){return D;};
        this.EEE  = function(D,v,$,b){return D;};
        this.EEEE = function(D,v,$,b){return D;};
        this.H    = function(D,v,$,b){var h = parseInt(v, 10); D.h = (h < 12 && D.pm) ? (h+12)%24 : h; b ? D.setUTCHours(D.h) : D.setHours(D.h); return D;};
        this.HH   = function(D,v,$,b){return this.H(D,v,$,b);};
        this.h    = function(D,v,$,b){return this.H(D,v,$,b);};
        this.hh   = function(D,v,$,b){return this.H(D,v,$,b);};
        this.m    = function(D,v,$,b){var m = parseInt(v, 10); b ? D.setUTCMinutes(m) : D.setMinutes(m); return D;};
        this.mm   = function(D,v,$,b){return this.m(D,v,$,b);};
        this.s    = function(D,v,$,b){var s = parseInt(v, 10); b ? D.setUTCSeconds(s) : D.setSeconds(s); return D;};
        this.ss   = function(D,v,$,b){return this.s(D,v,$,b);};
        this.S    = function(D,v,$,b){var S = parseInt(v, 10); b ? D.setUTCMilliseconds(S) : D.setMilliseconds(S); return D;};
        this.SSS  = function(D,v,$,b){return this.S(D,v,$,b);};
        this.a    = function(D,v,$,b){switch($.getAmPmStrings().indexOf(v)){case 0:D.am = true;return (D.h && D.h == 12) ? this.H(D, 0, $, b) : D;case 1:D.pm = true;return D.h ? this.H(D, D.h, $, b) : D;}return D;},
        this.G    = function(D,v,$,b){if($.getEras().indexOf(v) === 0){D.bc = true; return D.y ? this.yyyy(D, D.y, $, b) : D;}return D;};
        this.z    = function(D,v,$,b){return D;};
        this.Z    = function(D,v,$,b){return D;};
    };
    
    /**
     * Set format pattern
     * 
     * @param pattern, String type
     */
    thi$.setPattern = function(pattern){
        pattern = this.pattern = pattern || "EEE MMM dd HH:mm:ss yyyy";

        CLASS.infos = CLASS.infos || {};

        var info = CLASS.infos[pattern];
        if(info) return;

        info = CLASS.infos[pattern] = {};

        var pIndex = info.pIndex = js.util.LinkedList.newInstance();
        
        var str = pattern.replace(
            TOKEN, 
            function($0){
                var t = $0.charAt(0);
                $0 = ((t == 'M' || t == 'E') && $0.length > 4) ? 
                    $0.slice(0, 4) : $0;
                if(typeof Setter[$0] === "function"){
                    pIndex.push($0);
                    return Regx[$0];
                }

                if($0.length >= 2){
                    $0 = $0.replace(/"|'/g, "");
                }

                return $0;
            });

        info.dPattern = new RegExp(str);

    }.$override(this.setPattern);
    
    /**
     * Set format symbols
     * 
     * @see js.text.DateFormatSymbols
     */
    thi$.setDateFormatSymbols = function(DateFormatSymbols){
        this.symbols = DateFormatSymbols || 
            new(Class.forName("js.text.DateFormatSymbols"))();
    };

    /**
     * @see js.text.Format
     */     
    thi$.setSymbols = function(symbols){
        this.symbols = symbols || 
            new(Class.forName("js.text.DateFormatSymbols"))();

    }.$override(this.setSymbols);

    /**
     * Return a formatted string of the specified date
     * 
     * @param date, Date type, if null use current date
     * @param isUTC, boolean type, whether is UTC
     * 
     * @return String
     */
    thi$.format = function(date, isUTC){
        date = date ? date : new Date();
        if(!Class.isDate(date)){
            return date;
        }
        
        var _symbols = this.symbols;
        return this.pattern.replace(
            TOKEN, 
            function($0){
                var t = $0.charAt(0);
                $0 = ((t == 'M' || t == 'E') && $0.length > 4) ? 
                    $0.slice(0, 4) : $0;
                return (typeof Getter[$0] === "function") ? 
                    Getter[$0](date, _symbols, isUTC) : 
                    $0.slice(1, $0.length-1);
            });

    }.$override(this.format);
    
    /**
     * Return a <code>Date<code> object from a date string
     * 
     * @param datestr, String type
     * @param isUTC, boolean type, whether is UTC
     * 
     * @return Date
     */
    thi$.parse = function(datestr, isUTC){
        var info = CLASS.infos[this.pattern], 
        pIndex = info.pIndex, _symbols = this.symbols, 
        date, m = datestr.match(info.dPattern),$0;
        if(m){
            date = new Date(0);
            for(var i=1, len = m.length; i<len; i++){
                $0 = pIndex[i-1];
                date = Setter[$0](date, m[i], _symbols, isUTC);               
            }
            return date;
        }

        try{
            date = new Date(Date.parse(datestr));    
        } catch (x) {
            
        }
        
        if(!Class.isDate(date))
            throw SyntaxError("Invalid date string");

        return date;

    }.$override(this.parse);

    this._init.apply(this, arguments);
    
}.$extend(js.text.Format);


if(Date.SF === undefined){
    Date.SF = new js.text.SimpleDateFormat();

    Date.prototype.$format = function(pattern, isUTC){
        if(pattern) Date.SF.setPattern(pattern);
        return Date.SF.format(this, isUTC);
    };

    Date.$parse = function(datestr, pattern, symbols, isUTC){
        if(pattern) Date.SF.setPattern(pattern);
        if(symbols) Date.SF.setSymbols(symbols);
        return Date.SF.parse(datestr, isUTC);
    };
}
1
3
分享到:
评论
4 楼 key232323 2012-11-05  
凌空一叶 写道
$package("js.text"); 
 
$import("js.text.Format"); 
$import("js.util.LinkedList");

对前面几行依赖管理的比较感兴趣,博主用的是那个框架?


个人不觉得以java类库组织js的扩展
Data.parse方法不更简单么?
3 楼 sofosogo 2012-11-02  
好复杂啊,当然功能可能更丰富,但是真心没勇气看下去。
2 楼 hoodng 2012-11-02  
是我的一个开源框架。在这里你可以看一下

项目入口:https://github.com/jsvm/JSVM.git

演示入口:http://jsvm.github.com/JSVM/app/test/index.html

1 楼 凌空一叶 2012-11-02  
$package("js.text"); 
 
$import("js.text.Format"); 
$import("js.util.LinkedList");

对前面几行依赖管理的比较感兴趣,博主用的是那个框架?

相关推荐

    贴片元件代码查询

    然而,与传统插件元件不同,贴片元件往往只有丝印代码标识,而不是完整的型号,这给识别和选用带来了挑战。"贴片元件代码查询"这个资料正是为了解决这个问题,提供了常见贴片二极管、三极管等元件的代码与型号对照...

    wxhNotePad完整源代码

    这个标题表明我们正在讨论的是一款名为“wxhNotePad”的文本编辑器的完整源代码。通常,这样的项目是一个简单的文本处理应用程序,类似于Windows内置的记事本,但可能具有额外的功能或定制化选项。源代码是程序的...

    千年完整代码888888888888.rar

    【标签】"千年完整代码.rar" 该标签是文件的标识,用于快速识别文件内容,强调了这是一份完整的代码集合,可能对于理解和复现"千年"项目具有重要意义。 【压缩包子文件的文件名称列表】: 1. **FastNet.v5.6.3.D5-7....

    最原始龙族完整源代码_himavw_龙族原版_龙族_龙族服务端_龙族代码_

    对于有志于游戏开发或者对《龙族》有深厚感情的玩家来说,这份源代码是一份宝贵的资料。它可以用于学习游戏设计原理,研究过去的开发技术,甚至可以作为基础进行新的游戏开发或模组制作。同时,对于想要复刻或者改进...

    千年完整代码,千年最早版本,Pascal

    标题中的“千年完整代码,千年最早版本,Pascal”暗示了我们正在讨论的是一份历史悠久的Pascal编程语言的源代码,可能是一个名为“千年”的项目或软件的早期版本。Pascal是一种结构化编程语言,由Niklaus Wirth在1968...

    驱动程序电源管理处理完整参考代码.pdf

    总之,这份标题为"驱动程序电源管理处理完整参考代码.pdf"的文档是一份详尽的指南,它覆盖了WDM驱动程序中电源管理的核心概念和实现细节,特别适合那些已经有WDM USB驱动编写经验的开发者。通过理解IRP_MJ_POWER及...

    福利彩票C++完整源代码

    《福利彩票C++完整源代码》是一份专为C、C++初学者设计的实践项目,旨在帮助初学者深入理解C++编程语言的基础知识和实际应用。这份源代码在经典的开发环境VC6.0下成功编译,但请注意,由于其年代较为久远,可能无法...

    iOS完整程序代码

    "iOS完整程序代码"提供了一个全面的学习和参考资源,包含了从基础到进阶的各种功能实现,帮助开发者理解如何构建一个实际的iOS应用。下面将详细阐述这个资源中可能涵盖的关键知识点。 1. **Xcode集成开发环境**:...

    完整的RPG游戏源代码

    总之,“完整的RPG游戏源代码”是一份宝贵的教育资源,它涵盖了游戏开发的各个方面,提供了从零开始构建一款RPG游戏的全景视图。通过学习和研究这份源代码,你可以提升自己的编程能力,对游戏开发有更全面的认识,并...

    LinkGame游戏程序的完整源代码

    总的来说,LinkGame游戏程序的完整源代码是一份宝贵的学习资料,无论你是新手还是经验丰富的开发者,都能从中获取到丰富的知识和灵感。通过实际操作和修改源代码,你将能更深入地理解游戏开发的复杂性和乐趣。

    visual C++超级玛丽 完整源代码

    《Visual C++超级玛丽完整源代码》是一份珍贵的游戏编程学习资源,专为初学者设计。这个项目使用经典的Microsoft Visual C++ 6.0开发环境,通过源代码的形式揭示了如何构建一个类似“超级玛丽”的2D平台跳跃游戏。这...

    汽车自动驾驶技术完整源代码

    总的来说,这个压缩包提供的内容对于想要学习和研究自动驾驶技术的人来说是一份宝贵的资源。通过学习这些源代码,我们可以了解到自动驾驶系统的实际工作方式,通过深度学习的数据和算法原理,我们可以洞察到机器如何...

    164个完整的Java代码

    根据提供的文件信息,我们可以推断出这是一份包含164个完整Java代码的资源集合。这份资料被视为经典,不仅因为它包含了丰富的示例代码,还因为它可能是与Java编程相关的书籍或教程的一部分。接下来,我们将从标题、...

    五子棋程序(附带完整源代码)

    本资源提供了一份完整的五子棋程序源代码,旨在帮助学习者理解计算机博弈的基本原理和实现方法。这份源代码详细且注释清晰,适合初学者和有一定编程基础的人士进行学习。 一、源代码结构分析 1. 主程序模块:这是...

    SMD.rar_SMD code_smd_贴片_贴片 元件 代码 手册

    这份名为"SMD.rar"的压缩包文件,内含"SMD code_smd_贴片_贴片 元件 代码 手册",为工程师们提供了一个详尽的SMD元件代码查询资源。 SMD代码手册的重要性不言而喻。在设计电路板时,工程师需要准确地知道每个元件的...

    贪吃蛇完整代码

    总的来说,"贪吃蛇完整代码"项目不仅提供了游戏编程的实践经验,还涵盖了嵌入式开发的关键技术,对于想要进入嵌入式领域或提升编程技能的初学者来说,是一份宝贵的资源。通过这个项目,学习者可以逐步掌握EVC和WinCE...

    龙族原始代码完整无错可以完美编译

    《龙族原始代码完整无错可以完美编译》 在IT行业中,源代码是软件开发的基础,它揭示了程序的工作原理。"龙族原始代码"指的是一个特定项目或软件的未经修改的原始编程语言文本,这通常是程序员用C++、Java、Python...

    JAVA完整代码

    【JAVA完整代码】这个资源包含了164个不同的JAVA源代码文件,对于初学者来说,是一份非常宝贵的学习材料。JAVA是一种广泛使用的面向对象的编程语言,它的设计目标是具有简单性、面向对象、健壮性、安全性、平台独立...

    微信小程序商城完整源代码

    总结,这份“微信小程序商城完整源代码”为开发者提供了快速构建微信小程序商城的起点,通过理解和定制源代码,可以快速搭建符合自身需求的线上商店,对于想要涉足微信小程序开发的个人或企业来说,是一份宝贵的参考...

    C#打印合格证2.0打印机套打票据程序(含完整源代码和项目文件)

    本项目"**C#打印合格证2.0打印机套打票据程序**"提供了一整套解决方案,包括完整的源代码和项目文件,使得开发者能够快速构建符合自身业务需求的票据打印系统。 首先,我们要理解**打印机套打**的概念。打印机套打...

Global site tag (gtag.js) - Google Analytics