собственный формат даты и прототип javascript - PullRequest
0 голосов
/ 11 марта 2012

Я использую собственный формат даты, который выглядит следующим образом:

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);

Как мне переписать это так, чтобы он эмулировал функции .getMonth () .getYear (), встроенные в javascript.Я думаю, что мне нужно изменить прототип строк, но это моя первая попытка сделать что-то подобное.Я хотел бы иметь такие функции, как:

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.

Как мне это сделать?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 11 марта 2012

Используйте формат даты ISO8601 ГГГГ-ММ-ДД THH: mm: ssZ и есть библиотеки стандартизации даты и времени для javascript, а также методы UTC, чтобы избежать проблем с часовым поясом. Самая большая проблема со значениями Date в JavaScript заключается в том, что в объектах Date много неопределенного поведения. Для тех, кому нужен согласованный API-интерфейс Date, я бы предложил использовать фиксированную реализацию, которая переопределяет объект Date по умолчанию, что обеспечивает согласованное поведение во всех браузерах, но будьте осторожны, если у вас есть другие библиотеки, которые зависят от этого.

Я использовал https://github.com/csnover/js-iso8601/ в прошлом без проблем

http://www.w3.org/TR/NOTE-datetime

Поддерживает ли Javascript / EcmaScript3 синтаксический анализ даты ISO8601?

Обновление

В соответствии с просьбой, чтобы на самом деле добиться того, чего вы хотите, если вы не хотите использовать совместимый со стандартами формат даты, вы можете реализовать желаемый объект

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;

}());

С моими тестами в консоли:

> var someDate = new UserDate("3.11.2012.4.3");
> someDate.getDate()    
  "3.11.2012.4.3"
> someDate.getYear()
  2012
> someDate.getMonth()
  11
> someDate.getDay()
  3
> someDate.getHour()
  4
> someDate.getMinut()
  3

Серьезно, не рассматривайте возможность редактирования String.prototype, чтобы предоставить вам эту функциональность. Это очень плохая практика - расширять нативные прототипы в JavaScript, если вы действительно не уверены, что делаете. Конечно, не имеет смысла добавлять такие специальные функции в строковый объект общего назначения. Если вам нужен глобальный доступ к этому объекту UserDate, сделайте его глобальным объектом, как это было бы в этом примере. Опасность в том, что вы не знаете, что сторонние библиотеки делают с прототипом.

http://perfectionkills.com/extending-built-in-native-objects-evil-or-not/

Может быть стоит прочитать, если вам интересны аргументы в целом. Если вы действительно действительно хотите расширить прототип строки, тогда вы можете сделать что-то вроде

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

Но это сделает меня грустной курицей.

0 голосов
/ 11 марта 2012

Даты действительно просты.

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

Сохраните даты как временную метку UTC и позвоните new Date(timestamp).toGMTString(), если вы когда-нибудь захотите визуально их отобразить.

...