Просмотр полной версии : Вопрос по дате вместе с SharedObject
australian incognito
25.10.2006, 16:56
Хочу с помощью SharedObject загонять текущую дату в виде стринговой строки в sol файл, а потом (через определённый промежуток времени) сравнивать дату из файла + 1 час - с текущей датой, и в соответствии с этим запускать тот или иной сценарий. может кто уже сталкивался с такой проблемой и сможет мне подсказать пути решения. я уже 2 дня бьюсь над этой проблемой и все никак...
Спасибо.
А проблема в чем? В дате, записи или сравнении?
Кстати дату лучше сохранять в родном виде, а не в string.
А в чём конкретно проблема?
2 australian incognito:
Приведите код, который вы написали за эти два дня. ^_^
australian incognito
26.10.2006, 06:07
2 australian incognito:
Приведите код, который вы написали за эти два дня. ^_^
Я так полагаю, что здесь все полны скептицизмом по поводу приложенных мною усилий вообще. Оправданно, но, вот код:
var visit_info:SharedObject = null;
var myNowData:Date = new Date();
var myNowHours:Number = myNowData.getHours();
var myNowDay:Number = myNowData.getDate();
function init():Void {
visit_info = SharedObject.getLocal("visiting");
if (visit_info.data.myData == undefined) {
visit_info.data.myData = myNowData;
visit_info.flush();
} else {
var readData:SharedObject = SharedObject.getLocal("visiting");
var readedDate:Date = readData.data.myData;
var myOldHours:Number = readedDate.getHours();
var myOldDay:Number = readedDate.getDate();
var hourDifference:Number = myNowHours-myOldHours;
_root.onEnterFrame = function() {
if (hourDifference>=1 || hourDifference<0 || myOldDay != myNowDay) {
visit_info.clear();
readData.clear();
visit_info.data.myData = myNowData;
visit_info.flush();
trace("play intro");
} else {
trace("skip intro");
}
};
}
}
init();
Вроде как проблема решена, но я не уверен, что все работает корректно, поэтому и обратился к вам. Быть может вы что-нибудь улучшите?
Еще раз спасибо.
Ровно через месяц у вас возникнет ситуация, когда день и час первоначального запуска и текущего будут равны. Я бы на стал сравнивать дни и часы, а воспользовался методом getTime ()
/*
Вариант А
*/
//// это пишем потом в SharedObject
var dateA:Date = new Date ();
this.onEnterFrame = function () {
//// а это текущее время
var dateB:Date = new Date ();
var diffDate:Number = dateB.getTime () - dateA.getTime ();
//// временная зона полсе которой проигрываем интервал
//// расчитывается как мс [ * сек [* ч [ * дн]]]
//// в моем примере это произойдет через 3 секунды
var timeZone:Number = 1000 * 3
if (diffDate < timeZone) {
trace ("skip intro");
} else {
trace ("play intro");
}
};
или так
/*
Вариант Б
*/
//// это пишем потом в SharedObject
var dateA:Date = new Date ();
//// временная зона полсе которой проигрываем интервал
//// расчитывается как мс [ * сек [* ч [ * дн]]]
//// в моем примере это произойдет через 3 секунды
var timeZone:Number = 1000 * 3;
//// а это текущее время
var dateB:Date = new Date ();
var diffDate:Number = dateB.getTime () - dateA.getTime ();
setInterval(run, timeZone - diffDate);
function run () {
trace ("play intro");
}Я вам написал не готовый скрипт, а только логику. Поэтому запись в шару и выполняемые действия прикрутите сами, если конечно мои варианты вам больше подойдут.
А зачем каждый кадр скидывать данные на винт? Мало того, что это создаёт кучу обращений к винту, так ещё её и тормозить будет…
australian incognito
26.10.2006, 15:14
Ровно через месяц у вас возникнет ситуация, когда день и час первоначального запуска и текущего будут равны. Я бы на стал сравнивать дни и часы, а воспользовался методом getTime ()
Спасибо, но скорее всего, мне придется воспользоваться своим скриптом. Дело в его назначении: данный скрипт писался для шапки сайта, в которую встроено интро. Так вот, данный код дает пользователю возможность видеть интро только в первый раз при заходе на страничку index.html (после чего, на его компе будет sol файл), во всех же остальных случаях "прогулок" по сайту, но только в течение часа интро будет не доступно.
При заходе пользователя в любой другой день после - он снова будет видеть интро.
Способ, конечно, тупой, но это лучшее что я смог сделать.
p.s. для решения ситуации, описанной вами, я просто сравню еще и месяцы, тогда вероятность того, что пользователь залезет на мой сайт ровно через год, в тот же месяц, то же число и то же время в пределах часа достаточно низка, чтобы закрыть на это глаза.
australian incognito
26.10.2006, 16:47
А зачем каждый кадр скидывать данные на винт? Мало того, что это создаёт кучу обращений к винту, так ещё её и тормозить будет…
я извиняюсь, но приведенный мною код - это некий промежуточный вариант. В оригинале, события onEnterFrame быть не должно.
function init() {
visit_info = SharedObject.getLocal("visiting");
if (visit_info.data.myData == undefined) {
visit_info.data.myData = myNowData;
visit_info.flush();
} else {
var readData:SharedObject = SharedObject.getLocal("visiting");
var readedDate:Date = readData.data.myData;
var myOldHours:Number = readedDate.getHours();
var myOldDay:Number = readedDate.getDate();
var myOldMonth:Number = readedDate.getMonth();
var hourDifference:Number = myNowHours-myOldHours;
if (hourDifference>=1 || hourDifference<0 || myOldDay != myNowDay || myOldMonth != myNowMonth) {
visit_info.clear();
readData.clear();
visit_info.data.myData = myNowData;
visit_info.flush();
trace("play intro")
} else {
trace("skip intro");
gotoAndStop("stop_menu");
}
}
}
Тут опять же проблема - все работает, trace - выдаёт правильную работу логики, но вот gotoAndStop("stop_menu") просто не происходит. Может быть дело в коде, который идёт после этого? Но непонятно, почему он выполняется, если вышеприведеный код стоит раньше, и по идее следующий за ним код не должен выполняться.
2 australian incognito:
Выполняется, выполняется...
australian incognito
26.10.2006, 23:02
2 australian incognito:
Выполняется, выполняется...
Сам понимаю, что выполняется, но в контексте другого документа. Гляньте в моем случае, почему могут возникать проблемы. Чуть-что придется выкладывать исходник.
//stopping
stop();
//no scale for this project
fscommand("allowscale", false);
fscommand("showmenu", false);
//jumping thrue intro
var visit_info:SharedObject = null;
var myNowData:Date = new Date();
var myNowHours:Number = myNowData.getHours();
var myNowDay:Number = myNowData.getDate();
var myNowMonth:Number = myNowData.getMonth();
function init() {
visit_info = SharedObject.getLocal("visiting");
if (visit_info.data.myData == undefined) {
visit_info.data.myData = myNowData;
visit_info.flush();
} else {
var readData:SharedObject = SharedObject.getLocal("visiting");
var readedDate:Date = readData.data.myData;
var myOldHours:Number = readedDate.getHours();
var myOldDay:Number = readedDate.getDate();
var myOldMonth:Number = readedDate.getMonth();
var hourDifference:Number = myNowHours-myOldHours;
if (hourDifference>=1 || hourDifference<0 || myOldDay != myNowDay || myOldMonth != myNowMonth) {
visit_info.clear();
readData.clear();
visit_info.data.myData = myNowData;
visit_info.flush();
trace("play intro")
} else {
trace("skip intro");
gotoAndStop("stop_menu");
}
}
}
//
init();
//function to get total loaded bytes after loading mainPreloader_mc
_root.mainPreloader_mc.onLoad = function() {
total = _root.getBytesTotal();
};
//calling of this function
_root.mainPreloader_mc.onLoad();
//function that plays mainPreloader_mc to frame number = loaded percent of all site
_root.mainPreloader_mc.onEnterFrame = function() {
loaded = _root.getBytesLoaded();
percent = int(loaded/total*100);
this.gotoAndStop(percent);
if (loaded == total) {
_root.gotoAndPlay("afterPreload");
delete _root.mainPreloader_mc.onEnterFrame;
}
};
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.