Em uma ação do usuário uma vez ao dia: redefinição de 24 horas vs. redefinição da meia-noite [fechado]

24

Quando um usuário é capaz de executar uma ação apenas uma vez por dia, por exemplo, obter um ingresso gratuito para uma competição, há duas possibilidades que me deparei na minha experiência.

1) Reset de 24 horas

Se ele executar a ação no dia 1 às 23h45, ele poderá executar a ação novamente novamente no dia 2 ou depois das 23h45. Ele não poderá fazer 11:44 no dia 2.

2) Redefinição da meia-noite (ou qualquer horário fixo)

Independentemente da hora em que o usuário executar a ação no dia 1, assim que ele virar meia-noite e o dia 2 começar, ele poderá executá-lo novamente.


Ambos limitam o usuário a executar apenas uma ação por dia, mas geralmente encontro o método 1, que considero bastante inconveniente por dois motivos:

  • Primeiro eu tenho que esperar o tempo
  • e segundo, por um longo período, o registro de data e hora de minha execução será mais tarde e mais tarde, pois não poderei executar a ação exatamente nesse registro de data e hora todos os dias, apenas alguns segundos ou minutos depois.

Existe alguma razão técnica para preferir o método 1, embora na minha opinião seja uma importante desvantagem para o usuário declarada anteriormente?


Edite para especificar: estou falando especialmente de um exemplo, em que o intervalo de tempo real de 24 horas não é obviamente necessário, como no evento atual de giro livre de Theory11 , em que você recebe 1 giro grátis a cada 24 horas para ter uma chance em ganhar prêmios.

RUL
fonte
5
Pode haver um motivo para limitar o tempo real entre as ações, razão pela qual elas optariam por um bloqueio de 24 horas. Por exemplo, com a opção 2, você pode executar a ação às 23:59 e às 00:00 novamente.
Ivo Coumans
21
A resposta seria inteiramente específica do problema, e não é difícil encontrar problemas adequados. O software é desenvolvido para implementar regras de negócios, e não o contrário.
Blrfl
4
Observe que a meia-noite é um horário arbitrário. Poderia ser tão facilmente quanto você quiser.
David Starkey
2
Como uma nota de rodapé, a meia-noite pode ser problemática para os noturnos. Para contornar isso, o WoW, por exemplo, redefine as coisas "diárias" às 3 ou 4 da manhã.
21418 Kevin
6
Nota: Há uma variedade de jogos e outros que permitem apenas uma ação a cada 21 horas. Teoricamente, pode-se abusar disso para obter> 1 por dia, mas isso significa acordar durante o sono, o que é raro o suficiente para geralmente não ser tão importante para os servidores. Em seguida, permite que os usuários efetuem login "todas as manhãs" sem que o tempo limite avance lentamente ao longo do dia.
Mooing Duck

Respostas:

21

Estou surpreso, pois normalmente esperaria a redefinição da meia-noite.

No entanto, ele apresenta uma grande desvantagem, pois há mais de uma meia-noite a cada 24 horas. Você precisa escolher seu fuso horário.

Talvez seja por isso que o universal uma vez a cada 24 horas seja escolhido, você pode imaginar que a empresa talvez não queira aceitar que usuários de metade de países diferentes tenham horários locais fora da meia-noite ou, em vez de considerar que dizer "por dia" implicava meia-noite e, assim, eles alteram o marketing para "por 24 horas" e as especificações do software para corresponder

Embora eu ache isso bastante comum ver "termina às 14:00 GMT" ou similar nos dias de hoje.

Eu pensaria que o desafio de armazenar uma data da última ação para cada usuário seria mais difícil do que atribuir um fuso horário a usuários ou tipos de ação.

Editar Eu acho que vale a pena notar as diferenças entre os dois métodos

Regra 24h

  • Receberei um fluxo constante de eventos, com taxa limitada a menos de 1 por 24h.
  • Quando eu terminar, alguns usuários receberão menos eventos.
  • Preciso armazenar todos os usuários no último evento
  • Quando o horário de verão causa um dia longo ou curto, não terei 1 evento por dia
  • Os seres humanos não serão capazes de acertar exatamente 24 horas, então eu naturalmente receberei menos de 1 por dia em média

Regra 1 por dia do calendário

  • Recebo eventos agrupados por um período de 50h (? UTC + 14 a -12?) Atribuído a um dia do calendário
  • realisticamente, ainda tenho que armazenar todos os usuários no último evento como 'dias' durante a volta
  • Eu tenho um final definido de um dia em que posso dizer que todos os eventos depois de agora não estão lá .
  • Preciso saber a localização do usuário para saber em que dia o evento se aplica a
  • Algumas pessoas acordam muito mais cedo do que outras

1 por dia do calendário na regra UTC

  • Eu recebo bons uniformes 24 horas por dia
  • Eu posso balde meus eventos
  • Eu sei quando o início e o fim de um dia são
  • O horário de verão vai confundir as pessoas.
  • Os seres humanos podem ter 1 evento por dia
  • Humanos que não moram perto de Greenwich terão horários engraçados de início e fim
  • Talvez eu possa fazer uma otimização inteligente e apenas armazenar uma lista de usuários que entraram? (provavelmente acabarei armazenando todos os eventos e horários dos usuários)

* O agrupamento dos eventos será super útil para vários fins de relatório. por exemplo. digamos que tenho 10 prêmios a serem ganhos a cada período de 24 horas e eles diferem com o tempo. Quantos alunos entraram no dia 10? etc

Ewan
fonte
Você claramente toca minha linha de pensamentos enquanto eu estou igualmente surpreso. Eu acho que seria bastante preguiçoso ir para a redefinição de 24 horas, mas, como afirma a resposta de Richard Ward, pode ser mais difícil respeitar todos os fusos horários e até provocar problemas de comunicação a partir de quando o evento começa e termina.
RUL
hmm, acho que você tem suas respostas confusas. Mas, pensando bem, estou pensando que provavelmente é um problema de comunicação comercial / desenvolvedor. Posso apenas imaginar a reunião de planejamento ... Vendas: "Portanto, os usuários devem receber a oferta apenas uma vez por dia." Dev: "e se eles estiverem voando e cruzando a linha internacional de datas? Eles podem fazer dois pedidos? " Vendas: "..... não ... digamos 1 por 24h" Dev: "OK, hmm, preciso de mais tabelas para armazenar todos esses dados!" Vendas: "whateves"
Ewan
Entendo, você acha que a abordagem de 24 horas é menos complexa? Como acho que, além de ter uma tabela adicional, é muito mais simples dizer apenas 24 horas do que verificar e calcular em diferentes fusos horários. Mas você tem um bom argumento: ao sair do fuso horário, você pode obter mais de uma rodada.
RUL
4
Eu acho que é menos complexo para explicar
Ewan
10
Este. O material dependente do fuso horário abre uma lata inteira de worms que você pode deixar fechada usando a regra de tempo limite de 24 horas. E não é exatamente mais difícil armazenar quando uma ação aconteceu do que armazenar em um dia específico.
#
14

Em cima da minha cabeça:

  • Pode ser mais fácil implementar a versão "24 horas desde a última ação"
  • Se o usuário não executar a ação exatamente 24 horas após a última vez, eles poderão perder um período inteiro de 24 horas, porque a redefinição deve ocorrer quando eles estão dormindo ou trabalhando. Talvez o façam às 7 horas da manhã antes de sair para o trabalho e às 20 horas. No dia seguinte, eles fazem às 7h15, 7h30 e 7h45, e no último dia ficam até as 8h para realizar a ação antes de sair. No dia seguinte, eles não estão dispostos a ficar até as 8:15, portanto, apenas percam essa manhã e o façam depois de voltar para casa do trabalho às 18h, um intervalo de 34 horas. Se o resultado da ação for caro para a empresa, a economia poderá ser mais importante que o inconveniente.
Richard Ward
fonte
3
Bom argumento sobre o motivo sorrateiro de marketing, para que os usuários sintam falta um dia.
RUL
11
@RUL Ou, provavelmente mais ao ponto, é mais provável que um usuário compre uma "rodada extra paga" (ou o que seja) se perder uma de graça. O custo de dar giros pode ser trivial, mas as vendas extras ocasionais podem valer a pena.
TripeHound
Eu joguei um jogo baseado no tempo zulu, quando eu estava nos EUA. Não era trivial seguir em frente quando eu podia ou não fazer uma atividade.
Cort Ammon - Restabelece Monica
2
O ponto 2 é o motivo pelo qual a Blizzard (etc) evita o cronômetro de redefinição de 24 horas no WoW e em outros MMORPGs e, em vez disso, faz uma redefinição diária.
Adonalsium
8
Vale a pena notar que algumas empresas usam apenas um "diário" menos rigoroso - o League of Legends usa um bloqueio de 21 horas para a "primeira vitória do dia". Suficiente para manter os bônus aproximadamente diariamente, sendo conveniente para os jogadores. Pode ser parcialmente por causa da idéia de que você nem sempre vence o seu primeiro jogo e os jogos demoram cerca de 30 a 50 minutos; portanto, um relógio estrito seria realmente irritante (já que é provável que você diminua o tempo em 30 minutos ou mais por dia, momento em que não é atraente, porque você só tem tempo de jogo para obter a primeira vitória a cada três dias em uma agenda cheia).
Delioth 18/12/19
8

Como outras respostas mencionaram, o método 24 horas é mais amigável para vários fusos horários e é tão fácil de codificar quanto você armazena o último carimbo de data / hora bem-sucedido para cada usuário.

Ele também tem o "benefício" adicional de exigir que o usuário interaja com o aplicativo todos os dias para obter todas as ações diárias. Se houver uma redefinição da meia-noite, o usuário poderá executar uma ação às 23h59 e depois novamente às 12h. Eles poderiam fazer isso todos os dias e ainda assim conseguir todas as ações. Para alguns aplicativos, o objetivo das ações diárias é permitir que o usuário interaja com o aplicativo diariamente, o que é menos ideal.

Há uma terceira alternativa que evita as armadilhas da interface do usuário de ambos, mas é um pouco mais difícil de codificar.

3) Nenhuma sequência de mais de n ações em (n-0,75) * 24 horas

Requer duas variáveis ​​para armazenar, mas permite que alguém que não está tentando abusar do sistema use sua única ação a qualquer momento durante o dia sem ter que se preocupar com fusos horários e redefinições.

Também impede que alguém use mais de 1 ação "extra".

Portanto, implemente o algoritmo necessário para armazenar a hora de início da sequência, a última hora de reprodução e o número de ações na sequência.

Manter o controle do tempo da última ação permite rejeitar duas ações muito próximas umas das outras. Você pode fazer esse limite em menos de 24 horas, porque a faixa evita rastejar no início do dia.

Uma sequência continua, desde que você faça sua ação todos os dias. Se tomar uma ação significaria que você teria mais ações do que dias na sua sequência, ela será rejeitada. Isso evita que você avance lentamente, realizando ações "extras" porque o horário de início da sequência não muda.

algum pseudo-código para implementar a verificação e acompanhar os horários:

//precondition: streakStart and  lastAction are initialized as in the far past
//              streakCount is initialized as 0
graceHours=18;
checkAllowed(currentTime,&streakStart,&streakCount, &lastAction){
    diffhours=hoursDifferent(lastAction,currentTime);
    if(diffhours< 24 - graceHours){
        return false;
    }
    diffhours=hoursDifferent(streakStart,currentTime);
    if(diffhours <= 24*streakCount - graceHours){
        return false;
    }
    if(diffhours > 24*(streakCount+2)-graceHours){
        streakStart=currentTime;
        streakCount=0;
    }
    streakCount++;
    lastActionTime=currentTime;
    return true;
}

Como um bônus adicional, você recebe um contador de raias, se quiser.

Rick
fonte
Eu acho que essa é provavelmente a melhor resposta, pois "simplesmente funciona" para o usuário. A única desvantagem é que pode ser difícil de entender, mas isso só deve afetar as pessoas que tentam jogar com o sistema. Os 18 graceHours poderia ser explicado no texto, desde que eu acho que é importante para fazer este trabalho (eu acho que deveria ser menor embora)
rtpax
Abordagem interessante, apesar de tudo, você poderia elaborar mais em palavras, como essa funciona?
LSD
@RUL A idéia fundamental é que o tempo de redefinição de um usuário seja bloqueado assim que ele executar sua primeira ação. Não está bloqueado no momento exato em que a ação é executada, mas um pouco antes (18 horas antes, neste caso) para proporcionar uma melhor experiência ao usuário. Isso permite que um usuário fique um pouco à frente (ele pode executar suas duas primeiras ações em apenas 6 horas), mas não há erro cumulativo desde que o início ainda está travado - se eles tiverem atingido o período de carência máximo, terão que esperar em menos 24 horas para a próxima ação.
Jacob Raihle
5

Sobre o seu problema com a duração de 24 horas entre as ações, algumas empresas usam uma duração de 22 horas, dessa forma os usuários ficam um pouco de folga no momento exato do dia em que a ação é necessária e ainda assim incentivam os usuários a realmente executar a ação uma vez por dia - sem 23:59 - 00:00 brecha.

Não é uma resposta, mas não tenho pontos suficientes para comentar.

TheNaturalTanuki
fonte
Eu acho que este site faz isso com coisas descartáveis, como votos. Eles não são redefinidos a cada 24 horas, mas a cada 16 ou mais (não tem certeza do número exato). Eu acho que faz sentido - digamos que você comece o dia às 8 da manhã e comece a votar para cima / para baixo - você fica sem votos em 6 horas às 14:00. Com uma redefinição estrita de 24 horas após a ação, se você escolher o horário de redefinição na última votação, será necessário aguardar até as 14h novamente para começar a votar em vez do horário habitual e talvez você não tenha tempo. Se você escolher a primeira votação, terá um problema se um dia começar a votar às 10h, mas às 8h da manhã seguinte.
VLAZ
Embora agora que eu pense sobre isso - não tenho certeza se são realmente 16 horas de tempo de redefinição das ações. Pode demorar 24 horas e, por acaso, eu o peguei 8 horas após a redefinição diária. Mas acho que a lógica é válida - se você tiver 24 temporizadores individuais, talvez não seja conveniente para um usuário.
VLAZ
Isso tem o problema oposto da redefinição de 34 horas, de os usuários poderem executar ações extras se sempre agirem o mais rápido possível (é claro que isso exigiria uma péssima programação de sono ...)
Rick
3
tl/dr: 24 hour resets are the lazy man's way of minimizing load spikes

Além das respostas acima, a redefinição da meia-noite incentiva picos de tráfego. Se a ação estiver disponível para todos os participantes em um determinado momento, haverá um incentivo para muitas pessoas tentarem a ação ao mesmo tempo. Esta é a mesma razão pela qual a maioria dos estados tem sua carteira de motorista expirar no seu aniversário em vez de em uma data fixa (EUA): o DMV não seria capaz de acompanhar se todos tivessem sua carteira de motorista expirar em 1º de janeiro.

Além disso : se um sistema de computador precisar agir uma vez por dia para um grande número de usuários, você poderá fazer a mesma pergunta, e eu normalmente o design para combinar os dois. Você pode imaginar duas tarefas cron:

  1. Corra à meia-noite, encontre todos os registros, tome medidas
  2. Execute a cada minuto (ou alguma frequência regular), encontre todos os registros que não agiram desde 00:00 de ontem, tome uma ação, registre que a ação foi tomada

Na prática, achei o primeiro frágil. Se uma tarefa cron for interrompida durante a execução, algum número poderá não ter a ação aplicada e um trabalho adicional poderá ser necessário para que o sistema se lembre de onde estava e continue de onde parou. Também pode causar problemas se você obter registros suficientes para que sua tarefa cron não possa processá-los todos em um prazo razoável e ela seja encerrada antes de terminar.

Este último cuida de ambas as preocupações. Ele não tem como objetivo processar tudo com exatamente 24 horas de intervalo, mas, desde que sua tarefa cron possa executar facilmente todas as ações todos os dias, elas estarão bem próximas e você garantirá que todos sejam executados a cada dia (por exemplo, você não terá as coisas se afastando lentamente por mais de 24 horas). Mais importante ainda, ele continuará facilmente de onde parou se as coisas falharem por algum motivo.

https://www.youtube.com/watch?v=hoMO1yYC7pQ

Conor Mancone
fonte
0

Os bilhetes diários de ônibus / trem da TfL (Transport for London) são válidos das 04:30 às 04:30. Faça a troca quando as pessoas estiverem dormindo. Muitas pessoas desejam usar um serviço, das 8h30 às meia-noite e meia

gnasher729
fonte
4
Isso é bom para uso estritamente local, mas se você espera interações da Internet, não pode escolher um horário de redefinição adequado a todos. Mesmo as pessoas locais têm períodos diferentes de sono - trabalhadores em turnos, etc. Objeção menor, não o suficiente para -1.
Corey
O @Corey Steam vincula a maioria de seus temporizadores às 10h, horário do Pacífico. Mais especificamente, isso muda em qualquer promoção - diariamente (10h todos os dias), no meio da semana (10h na terça-feira - 10h na sexta-feira) ou no fim de semana (10h na sexta-feira - 10h na segunda-feira). Como uma loja internacional, isso é aplicado a todo mundo - que seria às 19:00 horário da Europa Central ou às 13:00 em Nova York. Talvez não seja conveniente para todos os fusos horários, mas é consistente. E, francamente, mesmo se eu estivesse usando PT, 10 horas da manhã não seria muito conveniente - estou na Europa, então a noite é melhor para mim.
VLAZ
0

A redefinição da meia-noite tem uma condição específica que pode ser desejável ou prejudicial, dependendo do problema que você está tentando resolver e é: Eu posso executar a ação um dia às 11:59:58 e novamente às 00:00:01. Se o espaço problemático for algum tipo de competição, isso pode proporcionar uma vantagem injusta para as pessoas que optam por executar suas ações perto da meia-noite. A regra de redefinição de 24 horas é a única maneira de garantir uma distribuição justa das ações disponíveis, independentemente da hora do dia que alguém tem disponível para elas.

A conseqüência da redefinição de 24 horas se tornar cada vez mais tarde pode ser atenuada, fornecendo uma tolerância, por exemplo, aceitando uma solicitação de ação dentro de 15 minutos após a redefinição, desde que a ação não seja realmente registrada (ou não seja necessária) efeito) até que a redefinição ocorra. Isso introduz um pouco mais de complexidade na solução, mas não consigo pensar em nenhuma estratégia de mitigação para poder executar duas ações diárias com segundos de diferença, como no caso de redefinição à meia-noite.

Jeff Lambert
fonte
0

Não vi ninguém mencionar o fato de que a regra das 24 horas incentiva visitas regulares de rotina. Muitos jogos têm uma recompensa de login / vitória uma vez ao dia, que é redefinida após 24 horas, porque eles preferem que você faça check-in por um curto período de tempo a cada 24 horas, em vez de duas vezes mais a cada 48 horas. Eu imagino que é semelhante para sites que oferecem brindes de ingressos.

Carl
fonte
11
Ambos os métodos forçam uma revisitação de 24 horas, exceto poucas pessoas, que esperam as 48 horas e executam a ação às 23:59:59 e às 00:00:01, mas acho que isso é pouco relevante.
LSD
@RUL Uso o método de check-in duas vezes seguidas para muitos jogos que redefiniram os horários em um fuso horário conveniente para mim. Portanto, não acho que isso seja tão irrelevante quanto você pensa. Geralmente, não faço logon a cada 48 horas, mas praticamente sempre recebo duas ações sempre que faço logon.
19418 Rick