Dijit DateTextBox - 以ISO /数字格式设置日期?

时间:2013-10-22 09:44:31

标签: javascript date dojo

我在我的屏幕中使用DateTextBox作为众多控件之一。我在一个地方注册它们然后在循环中批量设置值,在每个地方调用set('value', val)。所有控件都表现正常,只有DateTextBox不接受来自服务器的数据。

最初java的日期被序列化了很长时间(例如1280959200000),但是当我改为ISO格式(例如“2010-08-04T22:00:00.000 + 0000”)时,它也不被接受。但两者都是new Date()构造函数的接受日期格式。

在输出中,我得到ISO格式的日期值:“2013-08-04T22:00:00.000Z”所以它也应该在输入时被接受。

如何使用DateTextBox使其接受JavaScript的Date对象支持的所有格式的值,或者可以从我的服务器返回的格式之一?

2 个答案:

答案 0 :(得分:2)

我认为基本问题是Javascript内置Date对象只接受某些格式,而Dojo依赖于内置行为。在工作中,我们遇到了类似的问题,许多遗留的PHP代码习惯于以Mysql派生的格式传递日期(例如YYYY-MM-DD HH:MM:SS

我们当前的解决方法是子类dijit/form/DateTextBox,它还允许我们强加一些UI改进。当某些东西试图设置一个不是Date对象且看起来像MySQL日期时间的值时,此代码会重新形成它以匹配ISO-8601并将其传递给它。

自定义版本的DateTextBox的Dojo 1.9代码:

define([
    "dojo/_base/declare",
    "dojo/_base/lang",
    "dojo/_base/array",
    "dijit/form/DateTextBox"
], function(declare, lang, array, DateTextBox){

    var clazz = declare([DateTextBox], {


        _mysqlStyleExp : /^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2})$/,

        postMixInProperties: function(){ // change value string to Date object
            this.inherited(arguments);
            this.constraints.datePattern = "yyyy-MM-dd"; // Affects display to user
        },

        _convertMysqlDateToIso: function(value){
            value = lang.trim(value);
            var matches = this._mysqlStyleExp.exec(value);
            if(matches !== null){
                // Put the "T" in the middle and add fractional seconds with UTC
                // timezone

                // If your MySQL dates are NOT in UTC, obviously this will screw things up!                    
                return matches[1] + "T" + matches[2] + ".000Z";
            }else{
                return null;
            }
        },

        _setValueAttr : function(/*Date|String*/ value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){
            /*
             We want to be slightly more permissive in terms of the strings that can be set in order to support
             older code... But someday it'd be nice to standardize on Date.toJSON, so warn.
             */
            if(typeof(value) === "string"){
                var isoDate = this._convertMysqlDateToIso(value);
                if(isoDate !== null){
                    console.warn("Converting non-ISO date of "+value);
                    value = isoDate;
                }
            }
            this.inherited(arguments);
        }        
    });

    return clazz;
});

请注意,这只会影响流入 Dojo小部件的数据。

答案 1 :(得分:0)

docs说:

  

此小部件的值为JavaScript Date对象,仅限   指定的年/月/日。

所以不要这样(我假设你现在正在做):

new dijit.form.DateTextBox({value: "2010-08-04T22:00:00.000+0000"}, domNode);

这样做:

var myDate = new Date("2010-08-04T22:00:00.000+0000");
new dijit.form.DateTextBox({value: myDate}, domNode);