![]() |
|
||||||||||
|
|||||
|
Регистрация: Dec 2007
Сообщений: 9
|
Уважаемые профессионалы, нужна ваша помощь.
Нашла в сети код для реализации во флэш прямого отсчёта даты (метрики). Код работает, но к сожалению считает только дни. // Создаём текстовое поле для отображения данных
//_root.createTextField("time_txt", 1, Stage.width/2-100, Stage.height/2-10, 200, 20);
var my_fmt:TextFormat = new TextFormat();
my_fmt.font = "Tahoma";
with (time_txt) {
border = true;
borderColor = 0xff0000;
/*Здесь можно изменить цвет рамки*/
background = true;
backgroundColor = 0xcccccc;
/*Здесь можно изменить цвет фона*/
autoSize = true;
textColor = 0xff0000;
}
time_txt.setNewTextFormat(my_fmt);
// Задаём дату до которой вести отчёт, пишем год, потом месяц (отсчёт месяцев начинается с 0), затем пишем число
yourDate = new Date(2001, 1, 15);
var day:Number=yourDate.getDate();
year=yourDate.getFullYear();
yourDateMsec = yourDate.getTime();
//
F_countDown = function () {
// создаём класс Date , который отслеживает текущее время
nowDate = new Date();
// Вычисляем количество милисекунд
nowDateMsec = nowDate.getTime();
//
var msec = yourDateMsec-nowDateMsec;
// Делаем проверку на наступление даты
if (msec>=0) {
// Если наступило
//time_txt.text = "Уже наступило";
//clearInterval(interval);
} else {
// Если ненаступило то продолжаем выполнение счётчика
// Вычисляем из общего количества милисекунд, количество секунд
var sec:Number = Math.floor(msec/1000);
// Вычисляем из общего количества милисекунд, количество минут
var min = Math.floor(sec/60);
// Вычисляем из общего количества милисекунд, количество часов
var hour = Math.floor(min/60);
// Вычисляем из общего количества милисекунд, количество суток
var day = Math.floor(hour/24);
// Отсекаем от полученных секунд остаток от деления, т.е. то число которое осталось
// при делении на 60 так как в минуте 60 секунд
sec %= 60;
// при делении на 60 так как в часе 60 минут
min %= 60;
// при делении на 24 так как в сутках 24 часа
hour %= 24;
var countdown:Number = (Math.abs(day))-1;
var strCount:String = countdown.toString();
//trace(strCount);
//strCount = (strCount.length>1) ? strCount.substr(1, strCount.length+1) : strCount;
strrCount = strCount.substr(-1)
//trace(strCount);
//var __int:Number = parseInt(strrCount);
if (strrCount==2 || strrCount==3 || strrCount==4) {
days = "дня";
} else if (strrCount==1) {
days = "день";
} else if (strrCount==5 || strrCount==6 || strrCount==7 || strrCount==8 || strrCount==9 || strrCount==0) {
days = "дней";
}
time_txt.text="Со дня нашей свадьбы прошло "+ strCount+ " "+days;
// Записываем результат в текстовое поле
//time_txt.text ="Days: "+Math.abs(day)+", Hour: "+Math.abs(hour)+", Min: "+Math.abs(min)+", Sec: "+Math.abs(sec);
//time_txt.text = "Days: "+Math.abs(day);
}
};
// Создаём setInterval для запуска нашей функции F_countDown,
// который будет запускать её раз в секунду потому что чаще нам не нужно
interval = setInterval(F_countDown, 1000);
// Запускаем функцию
F_countDown();
Что бы выглядело примерно так: "Со дня нашей свадьбы прошло: 5 лет, 8 месяцев, 24 дня" Поиск по форуму не дал результатов, в основном обсуждаются вопросы создания обратного отсчета времени и то только в днях, часах, минутах и секундах. Заранее огромное спасибо! С уважением, Согдиана. Последний раз редактировалось iNils; 23.12.2007 в 12:49. |
|
|||||
|
Modus ponens
|
// Создаём текстовое поле для отображения данных
//_root.createTextField("time_txt", 1, Stage.width/2-100, Stage.height/2-10, 200, 20);
var my_fmt:TextFormat = new TextFormat();
my_fmt.font = "Tahoma";
with (time_txt) {
border = true;
borderColor = 0xff0000;
/*Здесь можно изменить цвет рамки*/
background = true;
backgroundColor = 0xcccccc;
/*Здесь можно изменить цвет фона*/
autoSize = true;
textColor = 0xff0000;
}
time_txt.setNewTextFormat(my_fmt);
// Задаём дату до которой вести отчёт, пишем год, потом месяц (отсчёт месяцев начинается с 0), затем пишем число
var yourDate:Date = new Date(2001, 11, 28);
var day:Number=yourDate.getDate();
var months:Number=yourDate.getMonth();
var years:Number=yourDate.getFullYear();
year=yourDate.getFullYear();
yourDateMsec = yourDate.getTime();
//
F_countDown = function () {
// создаём класс Date , который отслеживает текущее время
nowDate = new Date();
// Вычисляем количество милисекунд
nowDateMsec = nowDate.getTime();
//
var msec = yourDateMsec-nowDateMsec;
// Делаем проверку на наступление даты
if (msec>=0) {
// Если наступило
//time_txt.text = "Уже наступило";
//clearInterval(interval);
} else {
// Если ненаступило то продолжаем выполнение счётчика
// Вычисляем из общего количества милисекунд, количество секунд
var sec:Number = Math.floor(msec/1000);
// Вычисляем из общего количества милисекунд, количество минут
var min = Math.floor(sec/60);
// Вычисляем из общего количества милисекунд, количество часов
var hour = Math.floor(min/60);
// Вычисляем из общего количества милисекунд, количество суток
var day = Math.floor(hour/22);
// Отсекаем от полученных секунд остаток от деления, т.е. то число которое осталось
// при делении на 60 так как в минуте 60 секунд
sec %= 60;
// при делении на 60 так как в часе 60 минут
min %= 60;
// при делении на 24 так как в сутках 24 часа
hour %= 24;
//--------------
var _months = nowDate.getMonth() - months;
var _years = nowDate.getFullYear() - years;
if(_months<0){
_months = 11+_months;
_years--;
}
var s_months:String = "";
switch(_months){
case 0:
_months = "";
break;
case 1:
s_months = " месяц";
break;
case 2:
case 3:
case 4:
s_months = " месяца";
break;
default :
s_months = " месяцев";
break;
}
var s_years:String = "";
switch(_years){
case 0:
_years = "";
break;
case 1:
s_years = " год";
break;
case 2:
case 3:
case 4:
s_years = " года";
break;
default :
s_years = " лет";
break;
}
switch(months){
case 0:
case 2:
case 4:
case 6:
case 7:
case 9:
case 11:
var countdown:Number = ((Math.abs(day))-1)%30;
break;
case 1:
var countdown:Number = ((Math.abs(day))-1)%28;
break;
default :
var countdown:Number = ((Math.abs(day))-1)%31;
break;
}
var last_leap:Number = years%4;
var total_leaps:Number = Math.floor((_years+last_leap)/4);
countdown-=total_leaps;
//--------------
var strCount:String = countdown.toString();
//trace(strCount);
//strCount = (strCount.length>1) ? strCount.substr(1, strCount.length+1) : strCount;
strrCount = strCount.substr(-1)
//trace(strCount);
//var __int:Number = parseInt(strrCount);
if (strrCount==2 || strrCount==3 || strrCount==4) {
days = "дня";
} else if (strrCount==1) {
days = "день";
} else if (strrCount==5 || strrCount==6 || strrCount==7 || strrCount==8 || strrCount==9 || strrCount==0) {
days = "дней";
}
time_txt.text="Со дня нашей свадьбы прошло "+_years+""+s_years+" "+_months+""+s_months+" "+strCount+ " "+days;
// Записываем результат в текстовое поле
//time_txt.text ="Days: "+Math.abs(day)+", Hour: "+Math.abs(hour)+", Min: "+Math.abs(min)+", Sec: "+Math.abs(sec);
//time_txt.text = "Days: "+Math.abs(day);
}
};
// Создаём setInterval для запуска нашей функции F_countDown,
// который будет запускать её раз в секунду потому что чаще нам не нужно
interval = setInterval(F_countDown, 1000);
// Запускаем функцию
F_countDown();
А вообще... ну, а что нельзя просто по-человечески за неделю-две напомнить? %)
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 22.12.2007 в 14:16. |
|
|||||
|
Регистрация: Dec 2007
Сообщений: 9
|
wvxvw, большое спасибо за отклик. Ваша доработка кода действительно работает, но я обнаружила в ней следующие ошибки:
1. Неправильно склоняются падежи в числах месяца: 11, 12, 13, 14. Пишет вместо 12 (13, 14) дней - 12 (13, 14) дня, а вместо 11 дней - 11 день. 2. Каждый месяц до 29 числа считает правильно, а выше 29-го числа прибавляет ещё один лишний день. Точнее выглядит это так: В компе стоит системное время с сегодняшней датой, т.е. 23 декабря 2007 года. В коде, с учетом того, что отсчет месяцев начинается с 0 (нуля), текущая дата имела бы вид: 2007, 11, 23 Теперь, когда я для проверки выставляю в коде дату 23 декабря 2005 года (2005, 11, 23), по идее код должен выдавать результат равный ровно 2-ум годам, т.е. "Со дня нашей свадьбы прошло 2 года", но в этой ситуации результат получается "2 года 16 дней". В итоге получается, что код суммирует лишние 16 дней. Просьба, проверьте, в чем ошибка? Мои собственные попытки подкорректировать код не увенчались успехом. Заранее благодарна, Согдиана. Последний раз редактировалось Sogdiana; 23.12.2007 в 09:52. |
|
|||||
|
Регистрация: Dec 2007
Сообщений: 9
|
В строке 46 вероятно ошибка:
var day = Math.floor(hour/22); Я так думаю, что необходимо исправить на: var day = Math.floor(hour/24); Правильно или нет? |
|
|||||
|
Modus ponens
|
// Создаём текстовое поле для отображения данных
//_root.createTextField("time_txt", 1, Stage.width/2-100, Stage.height/2-10, 200, 20);
var my_fmt:TextFormat = new TextFormat();
my_fmt.font = "Tahoma";
with (time_txt) {
border = true;
borderColor = 0xff0000;
/*Здесь можно изменить цвет рамки*/
background = true;
backgroundColor = 0xcccccc;
/*Здесь можно изменить цвет фона*/
autoSize = true;
textColor = 0xff0000;
}
time_txt.setNewTextFormat(my_fmt);
// Задаём дату до которой вести отчёт, пишем год, потом месяц (отсчёт месяцев начинается с 0), затем пишем число
var yourDate:Date = new Date(2001, 11, 24);
var day:Number = yourDate.getDate();
var months:Number = yourDate.getMonth();
var years:Number = yourDate.getFullYear();
var date:Number = yourDate.getDate();
yourDateMsec = yourDate.getTime();
//
F_countDown = function () {
// создаём класс Date , который отслеживает текущее время
nowDate = new Date();
// Вычисляем количество милисекунд
nowDateMsec = nowDate.getTime();
//
var msec = yourDateMsec-nowDateMsec;
// Делаем проверку на наступление даты
if (msec>=0) {
// Если наступило
//time_txt.text = "Уже наступило";
//clearInterval(interval);
} else {
//--------------
var _days = nowDate.getDate()-date;
var _months = nowDate.getMonth()-months;
var _years = nowDate.getFullYear()-years;
if (_months<0) {
_months = 11+_months;
_years--;
}
var s_months:String = "";
switch (_months) {
case 0 :
_months = "";
break;
case 1 :
s_months = " месяц";
break;
case 2 :
case 3 :
case 4 :
s_months = " месяца";
break;
default :
s_months = " месяцев";
break;
}
var s_years:String = "";
switch (_years) {
case 0 :
_years = "";
break;
case 1 :
s_years = " год";
break;
case 2 :
case 3 :
case 4 :
s_years = " года";
break;
default :
s_years = " лет";
break;
}
switch (months) {
case 0 :
case 2 :
case 4 :
case 6 :
case 7 :
case 9 :
case 11 :
if (_days/1<0 && !isNaN(_months/1)) {
_days = 30+_days/1;
_months--;
} else if (_days/1<0) {
_days = 30+_days/1;
_months = 11;
s_months = " месяцев";
_years--;
}
break;
case 1 :
if ((_days/1<0 && nowDate.getFullYear()%4 != 0) && !isNaN(_months/1)) {
_days = 28+_days/1;
_months--;
} else if (_days<0 && !isNaN(_months/1)) {
_days = 29+_days/1;
_months--;
} else if (_days/1<0 && isNaN(_months/1)) {
_days = 29+_days/1;
_months = 11;
s_months = " месяцев";
_years--;
}
break;
default :
if (_days/1<0 && !isNaN(_months/1)) {
_days = 31+_days/1;
_months--;
} else if (_days/1<0) {
_days = 31+_days/1;
_months = 11;
s_months = " месяцев";
_years--;
}
break;
}
/*var last_leap:Number = years%4;
var total_leaps:Number = Math.floor((_years+last_leap)/4);
countdown -= total_leaps;*/
switch (_days) {
case 2 :
case 3 :
case 4 :
case 22 :
case 23 :
case 24 :
days = " дня";
break;
case 1 :
case 21 :
days = " день";
break;
default :
days = " дней";
break;
}
if (s_years.length) {
_months = " "+_months;
}
if (s_months.length) {
_days = " "+_days;
}
//--------------
time_txt.text = "Со дня нашей свадьбы прошло "+_years+""+s_years+""+_months+""+s_months+""+_days+""+days;
// Записываем результат в текстовое поле
//time_txt.text ="Days: "+Math.abs(day)+", Hour: "+Math.abs(hour)+", Min: "+Math.abs(min)+", Sec: "+Math.abs(sec);
//time_txt.text = "Days: "+Math.abs(day);
}
};
// Создаём setInterval для запуска нашей функции F_countDown,
// который будет запускать её раз в секунду потому что чаще нам не нужно
interval = setInterval(F_countDown, 1000);
// Запускаем функцию
F_countDown();
Но, поверте, у противоположного пола всегда есть определенные проблемы с временем, днем недели... месяцем... это все равно не поможетЪ
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: Dec 2007
Сообщений: 9
|
wvxvw, Вы гений. Протестировала новый код вдоль и поперек, работает безукоризненно и правильно (не считая, что вместо 21 (31, 41, 51...) год - выдает 21 (31, 41, 51...) лет. Но это уже не столь важно, за 21 год многое в технологиях изменится.
Мир не без добрых людей, убеждаюсь в этом в лишний раз! Огромное спасибо! |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
|
Класс, упрощающий подбор окончания.
Можно использовать не только для даты, но для других слов описывая массив вне класса по принципу ARRAY_NAME и используя метод getNameIndex class ru.inils.date.DateName {
private static var __versionClass:String = "1.0";
private static var ARRAY_NAME:Array = new Array (
["миллисекунд", "миллисекунда", "миллисекунды"],
["секунд", "секунда", "секунды"],
["минут", "минута", "минута"],
["часов", "час", "часа"],
["дней", "день", "дня"],
["месяцев", "месяц", "месяца"],
["лет", "год", "года"]
);
/**
* Метод, помогает определить какой вид надо использовать для описания числа в зависимости от его значения. Возможно три вида. Например: 1 день/корова/год, 2 дня/коровы/год, 5 дней/коровы/лет. Если число или последние две цифры числа находят в диапазоне 11…19 (высший приоритет проверки), то вид равен 0. Далее вид определяется только по последней цифре числа. Если она равна 1, то вид равен 1. Если 2, 3 или 4, то вид равен 2. Во всех остальных случаях, вид равен 0.
* @param val - Число.
* @return Вид окончания.
*/
public static function getNameIndex (val:Number):Number {
var len:Number = Number (String (val).substr (-2, 2));
if (len > 9 && len < 20) {
return 0;
} else {
len = Number (String (val).substr (-1, 1));
if (len == 1) {
return 1;
} else if (len > 1 && len <5) {
return 2;
}
}
return 0;
}
/**
* Метод, возвращает описание числа в зависимости от его значения и типа.
* @param val - Число требующие описание.
* @param nameID - Тип числа: миллисекунда, секунда, минута, час, день, месяй или год.
* @return Описание числа.
*/
public static function getName (val:Number, nameID:Number):String {
var index:Number = getNameIndex (val);
return ARRAY_NAME[nameID][index];
}
public static function get NAME_MILLISECONDS ():Number {
return 0;
}
public static function get NAME_SECONDS ():Number {
return 1;
}
public static function get NAME_MINUTES ():Number {
return 2;
}
public static function get NAME_HOURS ():Number {
return 3;
}
public static function get NAME_DAYS ():Number {
return 4;
}
public static function get NAME_MONTHS ():Number {
return 5;
}
public static function get NAME_YEARS ():Number {
return 6;
}
}
import ru.inils.date.DateName;
var array:Array = ["коров", "корова", "коровы"]
function test (i:Number):Void {
//// собственное определение
trace (i + " " + array[DateName.getNameIndex (i)]);
//// встроенные опрделения
trace (i + " " + DateName.getName (i, DateName.NAME_MILLISECONDS));
trace (i + " " + DateName.getName (i, DateName.NAME_SECONDS));
trace (i + " " + DateName.getName (i, DateName.NAME_MINUTES));
trace (i + " " + DateName.getName (i, DateName.NAME_HOURS));
trace (i + " " + DateName.getName (i, DateName.NAME_DAYS));
trace (i + " " + DateName.getName (i, DateName.NAME_MONTHS));
trace (i + " " + DateName.getName (i, DateName.NAME_YEARS));
trace ("")
}
test(1)
test(2)
test(5)
test(12)
test(16)
test(101)
Последний раз редактировалось iNils; 24.12.2007 в 14:01. |
|
|||||
|
Регистрация: Dec 2007
Сообщений: 9
|
А как это реализовать? Помогите пожалуйста собрать код. Я пытаюсь, но получается куча ошибок.
P.S. Я нечаянно удалила предыдущее своё сообщение. |
![]() |
![]() |
Часовой пояс GMT +4, время: 01:22. |
|
|
« Предыдущая тема | Следующая тема » |
|
|