Получение случайной даты из интервала
#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 анонимных