Дополнение первое: Переопределяем стандартный метод
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");
Спасибо за внимание
Последнюю функцию еще требуется доработать напильником, так как не все проверки на правильность в ней выполнены
Здравствуйте, Сэма, Вы писали:
Продолжим
Функции для получения Юлианской даты:
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>>
Здравствуйте, 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>
Супер. А в лунный календарь слабо?
Здравствуйте, Сэма, Вы писали:
С>Дополнение первое: Переопределяем стандартный метод toString
С>Достаточно часто встречается задача — взять текущую и не только дату и вывести ее в удобоворимом виде.
С>Если сделать вывод в лоб, то тот формат, в котором вводится строковое значение, удобным и понятным не назовешь.
Немного другой вариант, по мотивам .Net
Re: [ASP] Получение timestamp'aАвтор: Andir
Дата: 06.04.04
С Уважением, Andir!