Получение случайной даты из интервала
#1
Отправлено 06 апреля 2012 - 10:43
Имеется интервал дат с 1.01.2000 по 31.12.2010.
Как вы думаете, каким образом можно сгенерировать случайную дату, входящую в этот интервал?
Вопрос очень злободневный, поскольку в скриптах часто приходится использовать именно произвольную дату.
#2
Отправлено 06 апреля 2012 - 12:24
Доброго дня!
Имеется интервал дат с 1.01.2000 по 31.12.2010.
Как вы думаете, каким образом можно сгенерировать случайную дату, входящую в этот интервал?
Вопрос очень злободневный, поскольку в скриптах часто приходится использовать именно произвольную дату.
Доброго дня!
Для себя написал вот такое:
function date(d, m, otgod, pogod)
{
var ll = 0
if(m==0) {m = (Math.floor(Math.random()*11+1));}
var kolday = getkolday(m)
if(d==0) {d = (Math.floor(Math.random()*kolday+1));}
if(d > kolday) {d = kolday}
var date =d*1000000+m*10000+Math.floor(Math.random()*(pogod-otgod)+otgod)
var datef
if(date<9999999)
datef="0"+date;
else
datef=date;
Log.Message(datef);
return datef
}
function getkolday(m)
{
var kolday
switch (m)
{
case 1: kolday = 31; break;
case 2: kolday = 28; break;
case 3: kolday = 31; break;
case 4: kolday = 30; break;
case 5: kolday = 31; break;
case 6: kolday = 30; break;
case 7: kolday = 31; break;
case 8: kolday = 31; break;
case 9: kolday = 30; break;
case 10: kolday = 31; break;
case 11: kolday = 30; break;
case 12: kolday = 31; break;
}
return kolday
}
Громоздко, но вполне работоспособно. Отмечу, что у меня был отдельный упор на вывод даты в формате "01012012" именно с таким кол-вом цифр, без точек и т.п.
Для Вашей ситуации будет работать вызов
date(0, 0, 2000, 2010)
ЗЫ. Кстати, в моем случае, в отличие от ниженаписанного, 29го февраля просто не будет))
#3
Отправлено 06 апреля 2012 - 12:29
function isLeapYear(year){
if (year%4 == 0){
if (year%100 == 0){
if (year%400 == 0){
return false;
}
}
else{
return true;
}
}
else{
return false;
}
}
function getRandomDate(){
var months_normal = [31,28,31,30,31,30,31,31,30,31,30,31];
var months_leap = [31,29,31,30,31,30,31,31,30,31,30,31];
var year = Math.floor((Math.random()*10)+2000);
var months = [];
if (isLeapYear(year)){
months = months_leap;
}
else{
months = months_normal;
}
month = Math.floor(Math.random()*12);
var day = Math.floor((Math.random()*months[month])+1);
var date = new Date();
date.setDate(day);
date.setMonth(month);
date.setFullYear(year);
return date;
}
function test(){
Log.Message(getRandomDate());
}
#4
Отправлено 06 апреля 2012 - 12:45
Доброго дня!
Имеется интервал дат с 1.01.2000 по 31.12.2010.
Как вы думаете, каким образом можно сгенерировать случайную дату, входящую в этот интервал?
Вопрос очень злободневный, поскольку в скриптах часто приходится использовать именно произвольную дату.
Код приводить не буду он не такой сложный, но принцип такой.
1. Переводите даты в дни (или секунды Unix timestamp).
2. Выбираете случайное число м/у этими интервалами.
3. Переводите число обратно в дату
#5
Отправлено 06 апреля 2012 - 12:51
Кстати, намного более адекватный вариант, чем то что я выше нагородил :)...
1. Переводите даты в дни (или секунды Unix timestamp).
...
#6
Отправлено 06 апреля 2012 - 14:35
Temprorary Variables, Type = Table.
Посмотрите в хелпе "Generate Data Dialog", "Date and Time Generator"
#7
Отправлено 06 апреля 2012 - 15:10
То ли дело у нас, у ленивых!
function randomDate()
{
var date1 = new Date(2000, 1, 1);
var date2 = new Date(2010, 12, 31);
var randDate = randomInt(Number(date1), Number(date2));
return new Date(randDate);
}
function randomInt(min, max)
{
return Math.round(Math.random()*(max-min)+min)
}
Заодно написали полезную в быту функцию генерации случайного целого числа в заданном интервале...
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#8
Отправлено 06 апреля 2012 - 16:58
Рекомендую так:
function isLeapYear(year)
{
return (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0);
}
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#9
Отправлено 06 апреля 2012 - 17:02
Кстати, специально для Genka (и для всех, кому оно может быть интересным): у вас приведен очень стрёмный способ вычислять високосный год.Кстати, специально для Vader-a (и для всех, кому оно может быть интересным): у вас приведен очень стрёмный способ вычислять високосный год (с кучей if-ов и ветвлений).
Рекомендую так:function isLeapYear(year) { return (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0); }
Рекомендую так:
aqDateTime.IsLeapYear(year)
#10
Отправлено 06 апреля 2012 - 17:09
Рекомендую так:
aqDateTime.IsLeapYear(year)
Да, это лучше, но во-первых, вы первый начали, а во-вторых, в TestComplete 6.x и ниже этот способ работать не будет :)
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#11
Отправлено 06 апреля 2012 - 17:11
Рекомендую так:aqDateTime.IsLeapYear(year)
Да, это лучше, но во-первых, вы первый начали, а во-вторых, в TestComplete 6.x и ниже этот способ работать не будет :)
Эмм, начал что?
Ну и речь про TC8, если что.
#12
Отправлено 06 апреля 2012 - 17:13
Эмм, начал что?
Ну и речь про TC8, если что.
Как что? Говнокодить :)
А насчет ТС8 - да, действительно, изначально-то речь шла о 8м... Что-то я увлекся
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#13
Отправлено 06 апреля 2012 - 17:15
Ну так я в посте #5 согласился, что наговнокодил :)
Эмм, начал что?
Ну и речь про TC8, если что.
Как что? Говнокодить :)
А насчет ТС8 - да, действительно, изначально-то речь шла о 8м... Что-то я увлекся
#14
Отправлено 06 апреля 2012 - 17:17
Ну так я в посте #5 согласился, что наговнокодил :)
Ну, а я просто продолжил прекрасную традицию :)
Иногда вот так полезно разобрать какой-то случай, в дальнейшем помогает меньше говнокодить.
Уж лучше тут, чем в реальном проекте :)
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#15
Отправлено 11 апреля 2012 - 10:13
Эк у вас всё сложно: функции гигантские, генераторы...
То ли дело у нас, у ленивых!function randomDate() { var date1 = new Date(2000, 1, 1); var date2 = new Date(2010, 12, 31); var randDate = randomInt(Number(date1), Number(date2)); return new Date(randDate); } function randomInt(min, max) { return Math.round(Math.random()*(max-min)+min) }
Заодно написали полезную в быту функцию генерации случайного целого числа в заданном интервале...
Грациозно :)
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных

