Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 22.12.2007, 11:43
Sogdiana вне форума Посмотреть профиль Отправить личное сообщение для Sogdiana Найти все сообщения от Sogdiana
  № 1  
Ответить с цитированием
Sogdiana
 
Аватар для Sogdiana

Регистрация: 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.
Старый 22.12.2007, 13:46
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 2  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Код:
// Создаём текстовое поле для отображения данных 
//_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.
Старый 22.12.2007, 17:28
Sogdiana вне форума Посмотреть профиль Отправить личное сообщение для Sogdiana Найти все сообщения от Sogdiana
  № 3  
Ответить с цитированием
Sogdiana
 
Аватар для Sogdiana

Регистрация: 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.
Старый 23.12.2007, 10:24
Sogdiana вне форума Посмотреть профиль Отправить личное сообщение для Sogdiana Найти все сообщения от Sogdiana
  № 4  
Ответить с цитированием
Sogdiana
 
Аватар для Sogdiana

Регистрация: Dec 2007
Сообщений: 9
В строке 46 вероятно ошибка:
var day = Math.floor(hour/22);

Я так думаю, что необходимо исправить на:
var day = Math.floor(hour/24);

Правильно или нет?

Старый 23.12.2007, 18:13
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 5  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Код:
// Создаём текстовое поле для отображения данных 
//_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

Старый 23.12.2007, 20:16
Sogdiana вне форума Посмотреть профиль Отправить личное сообщение для Sogdiana Найти все сообщения от Sogdiana
  № 6  
Ответить с цитированием
Sogdiana
 
Аватар для Sogdiana

Регистрация: Dec 2007
Сообщений: 9
wvxvw, Вы гений. Протестировала новый код вдоль и поперек, работает безукоризненно и правильно (не считая, что вместо 21 (31, 41, 51...) год - выдает 21 (31, 41, 51...) лет. Но это уже не столь важно, за 21 год многое в технологиях изменится.
Мир не без добрых людей, убеждаюсь в этом в лишний раз!
Огромное спасибо!

Старый 23.12.2007, 20:59
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 7  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Незачто %)
__________________
Hell is the possibility of sanity

Старый 23.12.2007, 21:05
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 8  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: 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)
__________________
(и)Нильс.ru | Плагины для FlashDevelop


Последний раз редактировалось iNils; 24.12.2007 в 14:01.
Старый 23.12.2007, 22:16
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 9  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Мож тогда уже с классом iNils'a?
__________________
Hell is the possibility of sanity

Старый 23.12.2007, 22:26
Sogdiana вне форума Посмотреть профиль Отправить личное сообщение для Sogdiana Найти все сообщения от Sogdiana
  № 10  
Ответить с цитированием
Sogdiana
 
Аватар для Sogdiana

Регистрация: Dec 2007
Сообщений: 9
А как это реализовать? Помогите пожалуйста собрать код. Я пытаюсь, но получается куча ошибок.

P.S. Я нечаянно удалила предыдущее своё сообщение.

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:22.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 01:22.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.