Перейти к содержимому

Фотография

Получение случайной даты из интервала


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 14

#1 mskffo

mskffo

    Новый участник

  • Members
  • Pip
  • 63 сообщений
  • ФИО:Мария
  • Город:Москва

Отправлено 06 апреля 2012 - 10:43

Доброго дня!
Имеется интервал дат с 1.01.2000 по 31.12.2010.
Как вы думаете, каким образом можно сгенерировать случайную дату, входящую в этот интервал?
Вопрос очень злободневный, поскольку в скриптах часто приходится использовать именно произвольную дату.
  • 0

#2 Carabin

Carabin

    Новый участник

  • Members
  • Pip
  • 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го февраля просто не будет))
  • 0

#3 Vader

Vader

    Активный участник

  • Members
  • PipPip
  • 129 сообщений
  • Город:Харьков

Отправлено 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());
}

  • 0

#4 achumagin

achumagin

    Активный участник

  • Members
  • PipPip
  • 145 сообщений
  • ФИО:Alexey Chumagin
  • Город:Казань

Отправлено 06 апреля 2012 - 12:45

Доброго дня!
Имеется интервал дат с 1.01.2000 по 31.12.2010.
Как вы думаете, каким образом можно сгенерировать случайную дату, входящую в этот интервал?
Вопрос очень злободневный, поскольку в скриптах часто приходится использовать именно произвольную дату.


Код приводить не буду он не такой сложный, но принцип такой.
1. Переводите даты в дни (или секунды Unix timestamp).
2. Выбираете случайное число м/у этими интервалами.
3. Переводите число обратно в дату
  • 1
ap-test-team.blogspot.com

#5 Vader

Vader

    Активный участник

  • Members
  • PipPip
  • 129 сообщений
  • Город:Харьков

Отправлено 06 апреля 2012 - 12:51

...
1. Переводите даты в дни (или секунды Unix timestamp).
...

Кстати, намного более адекватный вариант, чем то что я выше нагородил :)
  • 0

#6 Rebz

Rebz

    Опытный участник

  • Members
  • PipPipPipPip
  • 471 сообщений


Отправлено 06 апреля 2012 - 14:35

Гм, если ТС 8, то почему нельзя это организовать встроенными средствами?
Temprorary Variables, Type = Table.
Посмотрите в хелпе "Generate Data Dialog", "Date and Time Generator"
  • 0

#7 Genka

Genka

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 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)
}

Заодно написали полезную в быту функцию генерации случайного целого числа в заданном интервале...
  • 1

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#8 Genka

Genka

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 06 апреля 2012 - 16:58

Кстати, специально для Vader-a (и для всех, кому оно может быть интересным): у вас приведен очень стрёмный способ вычислять високосный год (с кучей if-ов и ветвлений).
Рекомендую так:

function isLeapYear(year)
{
  return (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0);
}

  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#9 Vader

Vader

    Активный участник

  • Members
  • PipPip
  • 129 сообщений
  • Город:Харьков

Отправлено 06 апреля 2012 - 17:02

Кстати, специально для Vader-a (и для всех, кому оно может быть интересным): у вас приведен очень стрёмный способ вычислять високосный год (с кучей if-ов и ветвлений).
Рекомендую так:

function isLeapYear(year)
{
  return (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0);
}

Кстати, специально для Genka (и для всех, кому оно может быть интересным): у вас приведен очень стрёмный способ вычислять високосный год.
Рекомендую так:
aqDateTime.IsLeapYear(year)

  • 1

#10 Genka

Genka

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 06 апреля 2012 - 17:09

Рекомендую так:

aqDateTime.IsLeapYear(year)


Да, это лучше, но во-первых, вы первый начали, а во-вторых, в TestComplete 6.x и ниже этот способ работать не будет :)
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#11 Vader

Vader

    Активный участник

  • Members
  • PipPip
  • 129 сообщений
  • Город:Харьков

Отправлено 06 апреля 2012 - 17:11


Рекомендую так:

aqDateTime.IsLeapYear(year)


Да, это лучше, но во-первых, вы первый начали, а во-вторых, в TestComplete 6.x и ниже этот способ работать не будет :)


Эмм, начал что?
Ну и речь про TC8, если что.
  • 0

#12 Genka

Genka

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 06 апреля 2012 - 17:13

Эмм, начал что?
Ну и речь про TC8, если что.


Как что? Говнокодить :)

А насчет ТС8 - да, действительно, изначально-то речь шла о 8м... Что-то я увлекся
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#13 Vader

Vader

    Активный участник

  • Members
  • PipPip
  • 129 сообщений
  • Город:Харьков

Отправлено 06 апреля 2012 - 17:15



Эмм, начал что?
Ну и речь про TC8, если что.


Как что? Говнокодить :)

А насчет ТС8 - да, действительно, изначально-то речь шла о 8м... Что-то я увлекся

Ну так я в посте #5 согласился, что наговнокодил :)
  • 0

#14 Genka

Genka

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 06 апреля 2012 - 17:17

Ну так я в посте #5 согласился, что наговнокодил :)


Ну, а я просто продолжил прекрасную традицию :)
Иногда вот так полезно разобрать какой-то случай, в дальнейшем помогает меньше говнокодить.
Уж лучше тут, чем в реальном проекте :)
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#15 Колючка

Колючка

    Активный участник

  • Members
  • PipPip
  • 105 сообщений

Отправлено 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)
}

Заодно написали полезную в быту функцию генерации случайного целого числа в заданном интервале...


Грациозно :)
  • 0


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных