JavaScript: Полезные дополнения к типу Date
От: Сэма Россия  
Дата: 20.01.06 10:41
Оценка: 22 (5)
Дополнение первое: Переопределяем стандартный метод toString
Достаточно часто встречается задача — взять текущую и не только дату и вывести ее в удобоворимом виде.
Если сделать вывод в лоб, то тот формат, в котором вводится строковое значение, удобным и понятным не назовешь.
Пример:
var dtTest = new Date();
alert(dtTest);


Примечание для не достигших нирваны: alert умеет работать только со строковыми параметрами. Тип Date таковым не является и должен быть преобразован. Преобразование происходит с помощью неявного вызова метода toString.

Можно написать функцию, которая будет формировать нужную нам строку, и вызывать ее по мере необходимости. Я же предлагаю переопределить метод Date.toStrig таким образом, чтобы сфоримированная строка выводилась в требуемом формате.

Предположим, что в приложении везде используется формат вывода "dd.mm.yyyy".
Тогда наша функция переопределения будет выглядеть следующим образом:
var dtTest = new Date();
alert(dtTest);

Date.prototype.toString = function(){
   var sResult;
   
   if ( this.getDate()<10 ) {
      sResult = "0"+this.getDate()+".";
   }
   else {
      sResult = this.getDate()+".";
   }
   
   if ( this.getMonth()<9 ) {
      sResult += "0"+(this.getMonth()+1)+".";
   }
   else {
      sResult += (this.getMonth()+1)+".";
   }
   
   sResult += this.getFullYear();
   
   return sResult;
}

alert(dtTest);

Сравните ту строку, которая выводится до переопределения и после.

Дополнение второе и далее:
Кроме удобного отображения так же часто возникают стандарные задачи, которые так же можно реализовать в виде дополнений стандартного типа.

Вот небольшая коллекция таких расширений


//Определяем базовый массив количества дней в месяцах
Date.daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];

/***
 * Определение високосного года
 ***/
Date.prototype.isLeapYear = function() {
    var year = this.getFullYear();
    return ((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year)));
}

//Пример использования
var dtTest = new Date();

for (var i=2000; i<2099; i++) {
dtTest.setFullYear(i);
  if (dtTest.isLeapYear()){
    document.writeln(dtTest.getFullYear()+"-Високосный год</br>");
  }
}

/***
 * Получить количество дней в месяце
 ***/
Date.prototype.getDaysInMonth = function() {
  //Смотрим сколько дней в феврале
    Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
  return Date.daysInMonth[this.getMonth()];
}
/***
 * Порядковый номер дня с начала года
 ***/
Date.prototype.getDayOfYear = function() {
    var result = 0;
    DateюdaysInMonth[1] = this.isLeapYear() ? 29 : 28;
    for (var i = 0; i < this.getMonth(); ++i) {
        result += Date.daysInMonth[i];
    }
    return result + this.getDate() - 1;
}

/***
 * Получение даты из строки формата "dd.mm.yyyy"
 ***/
Date.prototype.parseString = function(value){
  var dateRegExp = /0[1-9]|[12][0-9]|3[01])[.](0[1-9]|1[012])[.](19|20)\d\d/;
  var dtResult = null;
  //Проверяем соответствие формату
  if (value.search(dateRegExp)==0 && value.length==10){
    var aDate = value.split(".");
        dtResult= new Date(aDate[2],aDate[1]-1,aDate[0]);
  }
    return dtResult;
} 

//Пример использования
var dtSDate = Date.parseString("01.01.2006");


Спасибо за внимание

Последнюю функцию еще требуется доработать напильником, так как не все проверки на правильность в ней выполнены
DIV'анчик дядюшки Сэма. BTLab
Re: JavaScript: Полезные дополнения к типу Date
От: retn нет
Дата: 20.01.06 14:53
Оценка: 3 (1)
Здравствуйте, Сэма, Вы писали:

Продолжим

Функции для получения Юлианской даты:

Date.prototype.zlong=function(val){return (val>0?Math.floor(val):Math.ceil(val));}
Date.prototype.zround=function(x,n,br){
    var d=1;for(var i=0;i<n;i++)d*=10;br=(br || 4);
    var _x=x*d;var _x1=Math.floor(_x);var _x2=Math.floor((_x-_x1)*10);
    return (_x1+(_x2>br?1:0))/d;
}

Date.prototype.jd1=function(){
    // для дат позднее 15.10.1582 года
    var y=this.getFullYear();var m=this.getMonth()+1;var d=this.getDate();
    var j=this.zlong((m-14)/12);
    var q=this.zlong(y+j+4800);
    var jd=(d-32075+this.zlong(1461*q/4)+this.zlong(367*(m-2-12*j)/12)-this.zlong(3*((q+100)/100)/4));
    return jd;
}

Date.prototype.jd2=function(){
    // int Y,int M,double DT
    // Перевод даты григорианского календаря в юлианскую дату (алгоритм Меёса)
    // Y - григорианский год [-4713,9999]
    // М - григорианский месяц [1,12]
    // целая часть DT - день [1,31], дробная часть DT - время, прошедшее от начала текущего дня [.0,.99999]
    // Возвращаемое значение - юлианская дата
    // Целая часть JD - число дней, прошедших от 1 января 4713 года до новой эры, дробная часть JD - время, прошедшее после 12 часов полудня дня JD
    // Корректная работа для дат начиная с 1.01.4713 до н. э. (то есть от Y = -4712, м = 1, от = 1.5) 
    var y=this.getFullYear();var m=this.getMonth()+1;var d=this.getDate();var h=this.getHours();
    //h=(((h/12)^1)*12+(h%12)); // to Julian time convert
    var t=(h*3600+this.getMinutes()*60+this.getSeconds())/86400;
    var dt=d+this.zround(t,5);
    if(m<3){y--;m+=12;}
    var a=this.zlong(y/100);var b=0;
    if(y+m/100+dt/10000>1582.1015) b=2-a+this.zlong(a/4);
    var c=this.zlong(365.25*y);
    if(y<0)c=this.zlong(365.25*y-0.75);
    var jd=c+this.zlong(30.6001*(m+1))+1720994.5+b+dt;
    return jd;
}
... << RSDN@Home 1.2.0 alpha rev. 634>>
Re[2]: JavaScript: Полезные дополнения к типу Date
От: Сэма Россия  
Дата: 20.01.06 15:30
Оценка: :)
Здравствуйте, retn, Вы писали:

R>Здравствуйте, Сэма, Вы писали:


R>Продолжим


R>Функции для получения Юлианской даты:

R>

R>Date.prototype.zlong=function(val){return (val>0?Math.floor(val):Math.ceil(val));}
R>Date.prototype.zround=function(x,n,br){
R>    var d=1;for(var i=0;i<n;i++)d*=10;br=(br || 4);
R>  ...
R>


Супер. А в лунный календарь слабо?
DIV'анчик дядюшки Сэма. BTLab
Re: JavaScript: Полезные дополнения к типу Date
От: Andir Россия
Дата: 22.01.06 23:50
Оценка:
Здравствуйте, Сэма, Вы писали:

С>Дополнение первое: Переопределяем стандартный метод toString

С>Достаточно часто встречается задача — взять текущую и не только дату и вывести ее в удобоворимом виде.
С>Если сделать вывод в лоб, то тот формат, в котором вводится строковое значение, удобным и понятным не назовешь.

Немного другой вариант, по мотивам .Net Re: [ASP] Получение timestamp'a
Автор: Andir
Дата: 06.04.04


С Уважением, Andir!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.