javascript专有日期格式和原型

javascript专有日期格式和原型,javascript,prototype,Javascript,Prototype,我使用的专有日期格式如下所示: var TheUserDate = "3.11.2012.4.3"; // is March 11th 2012 4:03AM 我创建这种格式是因为我的应用程序使用了很多时区更改,我不想依赖浏览器的时钟来实现这一点 我到处都有这样的代码: var DateArray = TheUserDate.split("."); var TheMonth = parseInt($.trim(DateArray[0]), 10); var TheDay = parseInt

我使用的专有日期格式如下所示:

var TheUserDate = "3.11.2012.4.3"; // is March 11th 2012 4:03AM
我创建这种格式是因为我的应用程序使用了很多时区更改,我不想依赖浏览器的时钟来实现这一点

我到处都有这样的代码:

var DateArray = TheUserDate.split(".");

var TheMonth = parseInt($.trim(DateArray[0]), 10);
var TheDay = parseInt($.trim(DateArray[1]), 10);
var TheYear = parseInt($.trim(DateArray[2]), 10);
如何重写它,使其模拟javascript中内置的.getMonth().getYear()函数。我想我需要修改字符串的原型,但这是我第一次尝试这样做。我希望有如下功能:

var TheMonth = TheUserDate.getMyMonth();
var TheDay = TheUserDate.getMyDay();
var TheYear = TheUserDate.getMyYear();
var TheDate = TheUserDate.getMyDate(); // to convert my format back to a javascript date.
我该怎么做


谢谢。

使用ISO8601日期格式YYYY-MM-DD THH:MM:ssZ,还有用于javascript的日期时间标准化库,以及UTC方法,以避免时区问题。JavaScript中日期值的最大问题是日期对象中有很多未定义的行为。对于任何需要一致日期api的人,我建议使用覆盖默认日期对象的固定实现,允许在所有浏览器中保持一致的行为,但如果您有其他依赖于此的库,请务必小心

我过去使用过,没有问题

更新 根据要求,如果您不想使用符合标准的日期格式,为了实际实现您想要的,您可以这样着手实现您想要的对象

var UserDate = (function () {

    function UserDate(dateString) {
        var dateArray= dateString.split('.'), i;

        if (dateArray.length !== 5) {
        // Handle this however you want, throw exception, 
        // bad date type etc

        }

        // No need to trim, parseInt doesn't care about 
        // leading or trailing whitespace
        for (i = 0; i < dateArray.length; i += 1) {
            dateArray[i] = parseInt(dateArray[i], 10);
        }


        // Check that the date array is well formed here if you want, 
        // check for NaN and value range
        // ...

        this._dateArray = dateArray;   
    }

    // Creates a date string from the internal date array
    UserDate.prototype.getDate = function () {
        var dateString = "", i;

        for (i = 0; i < this._dateArray.length; i += 1) {
            dateString += this._dateArray[i];
            if (i < this._dateArray.length - 1) {
                dateString += ".";
            }
        }

        return dateString;
    };

    // Returns the day value from the internal date array
    UserDate.prototype.getDay = function () {
        return this._dateArray[0];
    };

    // Returns the month from the internal date array
    UserDate.prototype.getMonth = function () {
        return this._dateArray[1];
    };

    // Returns the year from the internal data array
    UserDate.prototype.getYear = function()  {
        return this._dateArray[2];
    };

    // Returns the hour from the internal date array
    UserDate.prototype.getHour = function()  {
        return this._dateArray[3];
    };

    // Returns the minute from the internal date array
    UserDate.prototype.getMinute = function()  {
        return this._dateArray[4];
    };

    // more prototypes here


    return UserDate;

}());
严重的不要考虑编辑String.prototype给你这个功能。在JavaScript中扩展本机原型是非常糟糕的做法,除非您确实确定自己在做什么。向通用字符串对象添加这样的定制功能肯定没有任何意义。如果您需要对这个UserDate对象进行全局访问,那么将它设置为一个全局对象,就像在本例中一样。危险在于您不知道第三方库对原型做了什么

如果你对一般的论点感兴趣,也许值得一读。如果您真的想扩展字符串原型,那么您可以执行以下操作

String.prototype.getDay = function () {
    return this.split('.')[0];
}

但这会让我变成一只悲伤的小鸡。

日期真的很简单

var d = Date.now()
var dateString = new Date(d).toGMTString()

将日期存储为UTC时间戳,并调用
新日期(时间戳)。如果您想直观地呈现日期,请调用TogmString()

不,我不想更改日期格式,我想用原型增强日期格式。我不知道您为什么不采用完善的标准并使用已被证明有效的解决方案。我知道它不能回答你的问题,但我不能让人们认为专有日期格式是处理任何时区问题的方式,然而,如果有人没有在我之前到达那里,我将为您的问题找到一个确切的解决方案。我的格式使服务器端json解析和序列化变得容易。好的想法是,如果您使用标准,那么您选择的大多数语言中都会有代码来解析您正在使用的格式。无论您使用哪种服务器端语言,都很可能存在ISO8601日期/时间格式解析器(在标准库或第三方中)。然而,我已经使用一种可能的OO模式(往往是最流行的)编写了一个示例。如果您需要任何进一步的解释,请询问。好的,酷代码。对于本例,UserDate只是一个变量的名称。如果我的字符串变量名为ThisOtherDate,并且我有ThisOtherDate=“3.3.2012.20.3”;,该怎么办?我们不应该给字符串添加一个原型吗?如果我只是用字符串替换UserDate,它会起作用吗?问题是它们都有UTC和本地变量。它造成了一些混乱,所以我只是把这种格式放在一起,现在当我看到一个“日期”时,它只是表示一个时间的表达式,而不是一个特定的时间点。@frenchie
new date(d)。toLocaleString()
基于区域设置解析日期输入是一个不同的问题(也是一个痛苦的问题),基于本地设置渲染日期很容易
var d = Date.now()
var dateString = new Date(d).toGMTString()