Preciso de um método para adicionar "dias úteis" em PHP. Por exemplo, sexta-feira 05/12 + 3 dias úteis = quarta-feira, 10/12.
Preciso, no mínimo, do código para entender os fins de semana, mas o ideal é que ele também leve em consideração os feriados federais dos EUA. Tenho certeza de que poderia chegar a uma solução pela força bruta, se necessário, mas espero que haja uma abordagem mais elegante por aí. Qualquer um?
Obrigado.
Respostas:
Aqui está uma função dos comentários do usuário na página de função date () no manual do PHP. É uma melhoria de uma função anterior nos comentários que adiciona suporte para anos bissextos.
Insira as datas de início e término, junto com uma matriz de quaisquer feriados que possam estar entre os dois, e ele retorna os dias úteis como um número inteiro:
fonte
Obtenha o número de dias úteis sem feriados entre duas datas:
Use o exemplo:
Resultado:
Função:
fonte
$interval = DateInterval::createFromFormat('1 weekday');
Eu também recomendo usar$holidays = array_flip($holidays);
before the foreach eif isset($holidays[$period->format('Y-m-d')]);
para reduzir o tempo de processamento necessário por iteração. Mas recomendamos a criação de uma função personalizada para feriados para poder processar feriados relativos, como ação de graçaslast thursday of november
ou dia de trabalhofirst monday of september
Existem alguns argumentos para a função date () que devem ajudar. Se você marcar a data ("w"), receberá um número para o dia da semana, de 0 para domingo a 6 para sábado. Então .. talvez algo como ..
Este é apenas um exemplo aproximado de uma possibilidade ..
fonte
O cálculo de férias não é padrão em cada estado. Estou escrevendo um aplicativo de banco para o qual preciso de algumas regras de negócios rígidas, mas ainda só consigo obter um padrão aproximado.
fonte
fonte
Aqui está uma função para adicionar dias de negócios a uma data
Outra postagem menciona getWorkingDays (dos comentários do php.net e incluídos aqui), mas acho que quebra se você começar em um domingo e terminar em um dia de trabalho.
Usando o seguinte (você precisará incluir a função getWorkingDays da postagem anterior)
Dá o resultado como 5 e não 4
A seguinte função foi usada para gerar o acima.
Traga as férias ...
fonte
Você pode tentar esta função que é mais simples.
fonte
Função para somar ou subtrair dias úteis de uma determinada data, não contabiliza feriados.
usar assim ...
fonte
Minha versão baseada no trabalho de @mcgrailm ... ajustada porque o relatório precisava ser revisado em 3 dias úteis e, se enviado em um fim de semana, a contagem começaria na segunda-feira seguinte:
E calculando a diferença de duas datas em termos de dias úteis:
Como uma nota, todos que estão usando 86400, ou 24 * 60 * 60, por favor, não ... seu tempo de esquecimento muda de inverno / verão, onde um dia não é exatamente 24 horas. Embora seja um pouco mais lento o strtotime ('+ 1 dia', $ timestamp), é muito mais confiável.
fonte
Tentativa bruta de detectar o tempo de trabalho - segunda a sexta, das 8h às 16h:
fonte
Abaixo está o código de trabalho para calcular dias úteis úteis a partir de uma determinada data.
fonte
Aqui está outra solução sem loop for para cada dia.
fonte
Para feriados, crie uma série de dias em algum formato que a data () possa produzir. Exemplo:
Em seguida, use as funções in_array () e date () para verificar se o carimbo de data / hora representa um feriado:
fonte
Eu tinha essa mesma necessidade, comecei com o primeiro exemplo da bobina e acabei com este
hth alguem
fonte
!in_array($enddate,$holidays)
para!in_array(date('Y-m-d',$enddate),$holidays)
if usando um array de feriado passado como Bobbins '-$holidays=array('2013-06-16','2013-07-12','2013-08-05');
caso contrário, você está verificando um array cheio de datas para um timestamp, que sempre retorna falso.Variante 1:
Variante 2:
Variante 3:
As considerações adicionais sobre feriados podem ser feitas usando variações do acima, fazendo o seguinte. Nota! certifique-se de que todos os carimbos de data / hora estão na mesma hora do dia (ou seja, meia-noite).
Faça uma série de datas de feriados (como carimbos de data / hora), ou seja:
Modificar linha:
ser estar :
Feito!
fonte
fonte
Aqui está uma solução recursiva. Ele pode ser facilmente modificado para apenas acompanhar e retornar a data mais recente.
fonte
fonte
fonte
calcular dias úteis entre duas datas, incluindo feriados e semana de trabalho personalizada
A resposta não é tão trivial - portanto, minha sugestão seria usar uma classe onde você possa configurar mais do que confiar em uma função simplista (ou assumir um local e uma cultura fixos). Para obter a data após um determinado número de dias úteis, você:
Abordagem Funcional
fonte
Esta é outra solução, é quase 25% mais rápida do que verificar feriados com in_array:
fonte
Este snippet de código é muito fácil de calcular o dia útil sem fim de semana e feriados:
fonte
Sei que estou atrasado para a festa, mas uso esse velho conjunto de funções do Marcos J. Montes para calcular feriados e dias úteis. Ele se deu ao trabalho de adicionar um algoritmo de 1876 para a Páscoa e acrescentou todos os principais feriados dos EUA. Isso pode ser facilmente atualizado para outros países.
fonte
function get_business_days_forward_from_date ($ num_days, $ start_date = '', $ rtn_fmt = 'Ym-d') {
}
fonte
O add_business_days tem um pequeno bug. Tente o seguinte com a função existente e a saída será um sábado.
Startdate = Sexta-feira Dias úteis para adicionar = 1 Matriz de feriados = Adicionar data para a segunda-feira seguinte.
Eu consertei isso na minha função abaixo.
fonte
Acabei de fazer minha função funcionar com base no código Bobbin e mcgrailm, adicionando algumas coisas que funcionaram perfeitamente para mim.
fonte
Um aprimoramento da função oferecida por James Pasta acima, para incluir todos os feriados federais, e para corrigir 4 de julho (foi calculado como 4 de junho acima!), E também para incluir o nome do feriado como a chave da matriz ...
/ **
* National American Holidays
* @param string $ year
* @return array
* /
public static function getNationalAmericanHolidays ($ year) {
}
fonte
Acabei de escrever uma API que pode ser usada para manipular dias úteis (nenhuma dessas soluções funcionou muito bem para a minha situação :-); vinculando a ele aqui, caso alguém mais o considere útil.
~ Nate
Classe PHP para calcular dias úteis
fonte
Obrigado a Bobbin, mcgrailm, Tony, James Pasta e alguns outros que postaram aqui. Eu escrevi minha própria função para adicionar dias úteis a uma data, mas modifiquei com algum código que encontrei aqui. Isso controlará a data de início em um fim de semana / feriado. Isso também controlará o horário comercial. Eu adicionei alguns comentários e divido o código para torná-lo mais fácil de ler.
fonte
Pessoalmente, acho que esta é uma solução mais limpa e concisa:
Basta enviar a
new
data proposta para esta função.fonte