Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

horacio2009

[Resolvido] Obter Timestamp referente à Dia da Semana

Recommended Posts

boa tarde, pessoal!!

tudo bem?

seguinte:

usando o date(W) sei que estou na semana 42, usando o date(z) sei que hoje é quinta feira...

o que eu quero saber é, de posse desses dados, como eu faço para levantar dados no formato 0000-00-00 00:00:00(inicio) e 0000-00-00 00:00:00(fim) ??

sei que pode reduzir a quantidade de dias com base no "z", hoje é quinta, subtraio 3 e chego na segunda...dai, (teoricamente) crio o timestamp de segunda feira e subtraio de quinta, de posse dessas datas posso usar o between 1 e 2, porém, qual o melhor caminha para fazer isso???

como crio o timestamp de uma data - $determinado_calculo????

eu estou conseguindo montar uma lógica legal para isso, mas não estou sabendo como bota-la em prática...

Vocês me ajudam, pessoal???

Obrigado!!!

horácio

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, sinceramente eu não entendi o seu problema.

 

Escrevi um monte de coisa como resposta, mas poderia estar falando besteira, então explique-se melhor, por favor.

 

Não se ofenda, mas as idéias do post estão sem sentido. Organize os pensamentos e escreva de uma forma que possamos compreender para te ajudar.

 

Eu poderia responder sobre diferença entre datas ou subtração de datas quando você pode estar apenas querendo modificar um data.

Compartilhar este post


Link para o post
Compartilhar em outros sites

realmente ficou um pouco confuso, mas aí, eu fucei pra caramba por aí, e consegui...

bom, explicando novamente( apenas para explicar deixar claro o que eu queria)

 

quero descobrir que dia da semana é hoje: uso o W

logo em seguida, com base no "w" preciso descobrir que dia foi segunda feira( isso em formato "pesquisavel" 0000-00-00 00:00:00)para poder criar um ponto inicial de pesquisa.

após isso, eu preciso levantar determinados dados entre segunda feira e hoje.

 

ok, uma vez definido eu fiz o seguinte:

<?php
$semana_do_mes = date("W");
$hoje = date("w");
$ju = date("z");
/////////////////////////////
if($hoje =="2")
$calc="1";

if($hoje =="3")
$calc="2";

if($hoje =="4")
$calc="3";

if($hoje =="5")
$calc="4";

if($hoje =="6")
$calc="5";

if($hoje =="7")
$calc="6";

//aqui descubro que dia é hoje e que dia foi segunda feira
$hoje=time();
//gero a timestamp da bendita
$segunda = time() - ($calc * 24 * 60 * 60);

//calculo as datas
$result=$hoje-$segunda;
$result2=$result/(3600*24);
$result3=abs($result2);

//trasncrevo a timestamp para uma forma "pesquisável"
$comeco_semana=date("Y-m-d 00:00:00", $segunda);
//transcrevo a data de hoje para uma data "convencional"...
$hoje=date("Y-m-d G:i:s", $hoje);
//exibo os dados...
echo"
<br>
$comeco_semana<br>
$hoje
";
?>
é claro, com certeza deve ter maneira melhores de se gerar essas informações mas essa em principio, tá resolvendo muito bem meu problema...

quem quiser comentar ou dar alguma dica aa respeito, é bem vindo!!!!

ah, e desculpe pela confusão do post inicial... http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sabe, inicialmente me ocorreu essa idéia POGramática de achar a segunda-feira, até que lembrei que strtotime() também aceita "expressões", em inglês claro, que represente mais do que, por exemplo, +5 dias, -2 horas e etc.

 

Com isso me refiro ao uso do termo last que, em inglês significa último em conjunto com monday (segunda-feira)

 

Com isso veja como ficaria mais limpo o código:

 

$monday = date( 'Y-m-d H:i:s', strtotime( 'last monday' ) );

print $monday; // Saída 2010-08-16 00:00:00

Simples não?

 

:D

 

P.S.: Vou editar o título do tópico para algo mais condizente com sua dúvida (agora que ficou claro o que era) ^_^

Compartilhar este post


Link para o post
Compartilhar em outros sites

// seta o timezone 
date_default_timezone_set('America/Sao_Paulo');
// data de noje
$data = time();

do {
// pega o dia da semana
$diasemana = date('w', $data);
// se nao for segunda
if( $diasemana != 1 ){
	// subtrai um dia
	$data -= 24 * 3600;
}
// enquanto o dia da semana não for segunda
} while( $diasemana != 1 );

// exibe os dados
echo 'Dia da semana:' . $diasemana.'<br>';
echo 'Data:' . date('d/m/Y' , $data);

 

@braços e fique com Deus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

$monday = date( 'Y-m-d H:i:s', strtotime( 'last monday' ) );

 

var_dump( strftime( '%F %T' , strtotime( 'last monday' ) ) ); //string(19) "2010-08-16 00:00:00"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse lance de pegar por expressões é bacana, mas não 100% confiável.

Exemplo:

 

<?php
date_default_timezone_set('America/Sao_Paulo');
echo '<br />'.date("Y-m-d", strtotime('+1 month', mktime(0,0,0,1,31,2010)));
?>

 

A saida deveria ser 2010-02-28 e sai 2010-03-03.

 

Mas de qualquer forma, se para este caso funciona bem, manda ver ;-)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Discordo hufersil. A saída correta continua sendo 2010-03-03. Muitos confundem isso.

 

Você provavelmente acha que adicionando 1 mês a uma data que é o ultimo dia do mês, essa data resultante será também o ultimo dia, porém do proximo mês. Mas isso é errado. Execute esse trecho de código e veja o resultado:

 

echo ( strtotime( '+1 month' ) - time() ) / ( 60 * 60 * 24 );

 

:)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, então o MySQL está errado :-)

 

Executando pelo MySQL a função semelhante, funciona da maneira esperada.

 

select date_add('2010-01-31', interval 1 month);

 

Até onde eu entenda, ele deveria adicionar um mês levando em consideração o número de dias entre os meses.

Se não, eu poderia pedir para ele adicionar em numero de dias (que é o que parece que o PHP faz neste caso). Logo, neste ultimo caso, qual necessidade de eu falar para ele adicionar um mês se ele não leva em consideração o numero de dias dos meses? Pelo menos, para mim, não faria sentido.

 

@braços e fique com Deus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Discordo hufersil. A saída correta continua sendo 2010-03-03. Muitos confundem isso.

 

Bom, então o MySQL está errado :-)

 

Sim, está.

 

Quando faz: +1 month a pergunta é: Qual mês ?

 

Afinal, podemos ter meses de 28, 29, 30 e 31

 

Qual deles deve ser adicionado ?

 

Por exemplo:

 

Hoje é dia 20 de Agosto; Agosto tem 31 dias.

 

Quanto tempo você quer ADICIONAR à hoje ?

 

um mês de 28 dias ? http://forum.imasters.com.br/public/style_emoticons/default/seta.gif 17/09/2010

um mês de 29 dias ? http://forum.imasters.com.br/public/style_emoticons/default/seta.gif 18/09/2010

um mês de 30 dias ? http://forum.imasters.com.br/public/style_emoticons/default/seta.gif 19/09/2010

um mês de 31 dias ? http://forum.imasters.com.br/public/style_emoticons/default/seta.gif 20/09/2010

 

Porém, o MySQL ignora isso e apenas incrementa 1 mês em vez de adicionar 1 mês à data corrente.

 

Então, segundo a interpretação do MySQL:

 

Hoje é dia 20 de Agosto.

 

Incrementando 1 mês: 20/09/2010

Incrementando 2 meses: 20/10/2010

Incrementando 3 meses: 20/11/2010

 

Percebe a diferença ?

 

O MySQL, apesar da função date_add dizer adiciona, ele na verdade incrementa o mês.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Concordo com você João, mas em partes.

 

Se realmente o que eu quero é adicionar um mês, ele deveria, pelo menos no meu ponto de vista, acrescentar realmente um mês e manter o dia.

Se o dia for maior que o mês subsequente, voltaria para o dia anterior.

Como falei no post anterior, se eu quisesse adicionar em numero de dias, eu faria por número de dias, e não por mês.

 

Imagine a seguinte situação: tenho um sistema de inscrições, onde há parcelamento na inscrição.

Cada parcela, deve vir um mês após o outro. E o nosso amigo usuário faz a inscrição no dia 31/01.

Se eu utilizo essa lógica de pegar o número de dias do mês para adicionar um mês, como o PHP faz, em fevereiro o cara não teria parcela, pois a próxima data seria dia 03/03 e, depois desta, 31/03 se tomar sempre janeiro como base ;)

 

Entende no ponto que quero chegar?

 

Eu entendi perfeitamente como o PHP trabalha. Nisso não tenho dúvidas.

Só, no meu ponto de vista, a forma como ele trabalha com essa operação dá margens para muitos problemas.

 

@braços e fique com Deus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se realmente o que eu quero é adicionar um mês, ele deveria, pelo menos no meu ponto de vista, acrescentar realmente um mês e manter o dia.

 

Então você não quer adicionar 1 mês, você quer incrementar 1 mês.

 

Se o dia for maior que o mês subsequente, voltaria para o dia anterior.

 

Isso seria um problema em sistemas financeiros, principalmente aqueles que trabalham com juros.

 

Já pensou se seu banco disse para você: "Olha, seu rendimento mensal é de X, e tem vencimento todo dia 31"

 

Como temos alguns meses que só possuem 30 dias (Abril, Junho, Setembro e Novembro) e 1 mês de 28 dias, você perderá 7 dias de rendimento por ano.

 

Entende no ponto que quero chegar?

 

Eu entendi, mas com o exemplo da situação financeira acima, você compreendeu onde eu quero chegar ?

 

Eu entendi perfeitamente como o PHP trabalha. Nisso não tenho dúvidas.

Só, no meu ponto de vista, a forma como ele trabalha com essa operação dá margens para muitos problemas.

 

O ponto, amigo, é que sempre que trabalhamos com uma solução qualquer, precisamos ver quais são nossas necessidades.

 

Qual é o objetivo ?

 

Se a solução resolver o problema, ela é a única solução correta.

 

Porém, a função date_add possui uma nomenclatura errada e isso sim, dá margem à muitos erros.

 

Não em relação à adicionar dias, meses, ou anos; Mas ao fato dela não fazer o que o nome dela diz, essa função deveria ter como sufixo _inc e não _add

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi seu ponto sim. Continuo com o meu, mas entendi o seu.

Gosto desses debates porque sempre levantam pontos de vista diferentes, e sempre aprendemos um pouco mais.

 

@braços e fiquem com Deus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.