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

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

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

блогер
Регистрация: Apr 2008
Адрес: SPb
Сообщений: 3,718
Записей в блоге: 5
Отправить сообщение для dark256 с помощью ICQ Отправить сообщение для dark256 с помощью Skype™
По умолчанию Календарные исчисления

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

А именно. Есть две даты:

Код:
datIn = {D:day1, M:month1, Y:year1}
datOut = {D:day2, M:month2, Y:year2}
Надо:

1. Получить _ВСЕ_ наборы от dayIn до dayOut в виде день-месяц-год...
Сйчас реализовано в виде аж трех вложенных циклов, что, на мой взгляд, омерзительно:
Код AS1/AS2:
var allBronCelles = []
 
for ( var Y=StartYear; Y<=FinYear; Y++ ){						// Перебираю годы
 
	if ( StartYear == Y ){ A = StartMnt } else { A = 0 }
	if ( FinYear == Y ){ B = FinMnt } else { B = 11 }	
	for (var MN = A; MN<= B; MN++ ){							// Перебираю месяцы
 
		if ( StartMnt == MN ) { SD = StartDay } else { SD = 1 }
		if ( FinMnt == MN ) { FD = FinDay } else { FD = getDaysInMonth( Y )[ MN ] }
		for ( var DAY = SD; DAY<=FD; DAY++ ){					// Перебираю дни
			allBronCelles.push( { D:DAY, M:MN, Y:Y } )
		}
	}
}
Имхо громоздко и коряво... Работает, да, но...

2. Надо получить кол-во дней, прошедших от одной даты до другой.
У меня решение сейчас сводится к предыдущему динозавру + счетчик этих дней.

3. Определить, сколько дней относится к каждому из месяцев, входящих в диапазон....
По идее снова берем ужас из п.1. и при смене месяца (корявость) счетчики пихаем в массив...

Подразумевается, что year1 - year2 может занимать лет 10-20.... Високостности, разные длины месяцев и прочее учитывается....
За неконвенционность - сорри.
__________________
FLASHER.MAP SOUNDSTAGE / CS3 / AS2

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

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
Делаем две даты, вычитаем time, делим на ms * s * m * h, и получаем количество дней + 1 в данном диапазоне.
Дальше нужен только один цикл.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 11.05.2014, 16:49
dark256 вне форума Посмотреть профиль Отправить личное сообщение для dark256 Посетить домашнюю страницу dark256 Найти все сообщения от dark256
  № 3  
Ответить с цитированием
dark256
 
Аватар для dark256

блогер
Регистрация: Apr 2008
Адрес: SPb
Сообщений: 3,718
Записей в блоге: 5
Отправить сообщение для dark256 с помощью ICQ Отправить сообщение для dark256 с помощью Skype™
В целом - логично. Но... у меня предполагается генерить 100-200-... подобных выборок длиной до 150-300 "дней".
Соответственно вопрос: не будет ли Date тормозить данный процесс в особо крупных размерах...
И не будет ли все это менее энергоемко на циклах или еще каких вариантах высокопроизводительных алгоритмах?
Дело не в том, что я не знаю КАК.... Мне кажется, что я не знаю как это сделать эстетично

Эксперименты с секундомером пока не производил, ибо подозреваю, что опять-таки я велосипед изобретать стану.
__________________
FLASHER.MAP SOUNDSTAGE / CS3 / AS2


Последний раз редактировалось dark256; 11.05.2014 в 16:59.
Старый 12.05.2014, 23:48
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 4  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
типа эстетично
Код AS1/AS2:
package
{
	import flash.display.Sprite;
 
	public class Main extends Sprite
	{
 
		public function Main():void
		{
			var d1:Date = new Date(2014, 3, 29);
			var d2:Date = new Date(2014, 4, 11);
 
			var dateCounter:DateCounter = new DateCounter(d1, d2);
 
			trace("список : " + dateCounter.list);
			trace("всего: " + dateCounter.list.length);
			trace(" в апреле 2014: " + dateCounter[2014][3]);
			trace(" в мае 2014: " + dateCounter[2014][4]);
			trace(" в июне 2014: " + dateCounter[2014][5]);
 
		}
 
	}
 
}
 
dynamic class DateCounter
{
	public const list:Array = [];
	public const dayTime:int = 24 * 60 * 60 * 1e3;
 
	public function DateCounter(d1:Date, d2:Date):void
	{
 
		for (var j:int = d1.getFullYear(); j <= d2.getFullYear(); j++)
		{
			this[j] = [];
			for (var k:int = 0; k < 12; k++)
			{
				this[j][k] = 0;
			}
		}
 
		var days:int = (d2.time - d1.time) / dayTime + 1;
		var date:Date = new Date();
 
		for (var i:int = 0, t:Number = d1.time; i < days; i++)
		{
			date.setTime(t + i * dayTime);
			var y:int = date.getFullYear();
			var m:int = date.getMonth();
			var d:int = date.getDate();
			list.push(new Day(d, m, y));
			this[y][m]++;
 
		}
 
	}
 
}
 
class Day
{
	public var d:int;
	public var m:int;
	public var y:int;
 
	public function Day(d:int, m:int, y:int)
	{
		this.y = y;
		this.m = m;
		this.d = d;
 
	}
 
	public function toString():String
	{
		return d + "-" + m + "-" + y;
	}
}
при обращении к 'неучтенному' году получим RTE, поэтому совсем эстетично было бы наследоваться от Proxy, чтоб эти нюансы учесть\обработать, но это уже совсем уже будет, можно и по-простому не обращаться к ним или инициализировать сразу какой-нить диапазонище 1980..2080
насчет 'тормозить в особо крупных размерах..' имхо напрасные опасения, нечему тут особо тормозить-то

Старый 13.05.2014, 01:29
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 5  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
dark256, когда вы сказали, что регулярно забиваете на концепции, я подумал, что вы пошутили...
__________________
There is no thing in this world that is not simple.

Старый 13.05.2014, 03:06
Rzer вне форума Посмотреть профиль Отправить личное сообщение для Rzer Посетить домашнюю страницу Rzer Найти все сообщения от Rzer
  № 6  
Ответить с цитированием
Rzer
 
Аватар для Rzer

блогер
Регистрация: Feb 2007
Адрес: Spb
Сообщений: 612
Записей в блоге: 8
Отправить сообщение для Rzer с помощью ICQ
Код AS3:
var d1:Date = new Date(2014, 3, 29);
var d2:Date = new Date(2014, 4, 11);
 
while (d1.time <= d2.time) {
   trace(d1.toDateString());
   d1.time += 60 * 60 * 24*1000;
}

Старый 14.05.2014, 10:44
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 7  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
а вот еще эстетические вариации: один раз генерим список дат и из него потом дергаем что потребуется
Код AS3:
package
{
	import flash.display.Sprite;
 
	public class Main extends Sprite
	{
 
		public function Main():void
		{
 
			var d1:Date = new Date(2014, 3, 29);
			var d2:Date = new Date(2014, 4, 11);
 
			DateList.init(2000, 2030);
 
			trace("список : " + DateList.getRange(d1, d2));
			trace("всего: " + DateList.getRange(d1, d2).length);
			trace(" в апреле 2014: " + DateList.getMonthRange(d1, d2, 2014, 3).length);
			trace(" в мае 2014: " + DateList.getMonthRange(d1, d2, 2014, 4).length);
			trace(" в июне 2014: " + DateList.getMonthRange(d1, d2, 2014, 5).length);
 
		}
 
	}
 
}
 
//===============//
class DateList
{
	public static const list:Array = [];
	public static const day:int = 24 * 60 * 60 * 1000;
 
	public static function init(y1:int, y2:int):void
	{
		var d1:Date = new Date(y1);
		var d2:Date = new Date(y2, 11, 31);
 
		while (d1.time <= d2.time)
		{
			list.push(dateToString(d1));
			d1.time += day;
		}
	}
	public static function dateToString(d:Date):String
	{
		return d.getDate() + "-" + d.getMonth() + "-" + d.getFullYear()
	}
	// список дней диапазона d1..d2
	public static function getRange(d1:Date, d2:Date):Array
	{
		var i1:int = list.indexOf(dateToString(d1));
		var i2:int = list.indexOf(dateToString(d2)) + 1;
		return list.slice(i1, i2);
	}
	// список дней диапазона d1..d2, попадающих в year.month
	public static function getMonthRange(d1:Date, d2:Date, year:int, month:int):Array
	{
 
		var r1:Date = new Date(year, month);
		var r2:Date = new Date(year, month + 1, 0);
		if (r1 < d1) r1 = d1;
		if (r2 > d2) r2 = d2;
 
		return getRange(r1, r2);
	}
 
}

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

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

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


 


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


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