[PHP] - Somma data, valore inaspettato

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
wais
Prode Principiante
Messaggi: 34
Iscrizione: lunedì 5 settembre 2011, 14:35

[PHP] - Somma data, valore inaspettato

Messaggio da wais »

Salve a tutti, avrei la neccessità di sommare 5 anni ad una data inserita dall'utente. La soluzione da me adottata è stata la seguente:

Codice: Seleziona tutto

$auth_date = $this->data_autorizzazione;
$newdate = strtotime ( '+5 year' , strtotime ( $auth_date ) ) ; 
(string)$newdate = date ( 'd/m/Y' , $newdate ); 
dove

Codice: Seleziona tutto

$this->data_autorizzazione
è la data inserita dall'utente.
Al termine dell'operazione per la data di input 11/09/2011 l'output è 09/11/2016;
effettivamente somma gli anni ma i giorni e i mesi mi sembrano troppo sballati rispetto la data iniziale, voi che dite?

Per altre date come per esempio 09/09/2011 l'output è 09/09/2016

thanks
Avatar utente
Sorriso.
Prode Principiante
Messaggi: 29
Iscrizione: martedì 30 agosto 2011, 20:56

Re: [PHP] - Somma data, valore inaspettato

Messaggio da Sorriso. »

Fai così:

Codice: Seleziona tutto

$daymonth = $_POST['daymonth'];
//puliamo la stringa da eventuali caratteri che non siano numeri
$daymonth = preg_replace("[^0-9 ]", " ", $daymonth );
$hear = $_POST['hear'];
$hear = $hear + 5;

$new_date = $date.$hear;
echo $new_date
Dovrebbe funzionare ;)
wais
Prode Principiante
Messaggi: 34
Iscrizione: lunedì 5 settembre 2011, 14:35

Re: [PHP] - Somma data, valore inaspettato

Messaggio da wais »

mmm scusami ma non riesco a comprendere il tuo esempio. Nel tuo esempio la var $date come e dove viene inizializzata? poi,se non ho capito male, così effettuo una somma algebrica solo sull'anno senza tenere conto dei mesi e dei giorni; così facendo l'applicativo potrebbe imbattersi in errori di consistenza dei dati.
Prendi il mese di febbraio per esempio che conta 28 giorni e 29 negli anni bisestili, potrei ritrovarmi con una data del tipo 29/02/2013, ma nel 2013 febbraio sarà di 28 giorni..
Oppure dopo 11 ore davanti al pc sto iniziando a dire gigantesche cavolate???? :-\ ::)
Ultima modifica di wais il giovedì 8 settembre 2011, 21:13, modificato 1 volta in totale.
Avatar utente
Sorriso.
Prode Principiante
Messaggi: 29
Iscrizione: martedì 30 agosto 2011, 20:56

Re: [PHP] - Somma data, valore inaspettato

Messaggio da Sorriso. »

wais ha scritto: mmm scusami ma non riesco a comprendere il tuo esempio. Nel tuo esempio la var $data come e dove viene inizializzata? poi,se non ho capito male, così effettuo una somma algebrica solo sull'anno senza tenere conto dei mesi e dei giorni; così facendo l'applicativo potrebbe imbattersi in errori di consistenza dei dati.
Prendi il mese di febbraio per esempio che conta 28 giorni e 29 negli anni bisestili, potrei ritrovarmi con una data del tipo 29/02/2013, ma nel 2013 febbraio sarà di 28 giorni..
Oppure dopo 11 ore davanti al pc sto iniziando a dire gigantesche cavolate???? :-\ ::)
No hai ragione, la mia è solo una somma algebrica. Per quanto riguarda la data viene inizializzata da un form html dove andrai a chiedere qual'è la data con cui si vuole fare l'operazione.
La soluzione te la posso suggerire solo in linea teorica. Perché adesso non ho il cervello pronto per scrivere tanto. Crea un hash dove per chiave metti gli anni bisestili e per valore questa stringa "28 2".
Ovviamente chiedi l'anno e la data. Insomma come ho fatto io prima. Quindi prendi l'anno
A questo punto, quando l'anno viene inserito fai il calcolo algebrico di prima. Adesso fai un controllo e verifica se il valore dell'anno è uguale a una delle chiavi dell'hash. Se così fosse allora prendi il valore e la chiave dell'hash e salvalo in un'altra variabile e poi stampa a video il tutto  (good).
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [PHP] - Somma data, valore inaspettato

Messaggio da Zoff »

Sorriso. non c'entra nullo quella che hai detto.

@wais, strtotime() usa la sintassi m/d/Y quindi la data che legge è la "nostra" 09/11/2011

Infatti se modifichi il codice così:

Codice: Seleziona tutto

$auth_date = $this->data_autorizzazione;
echo 'Data letta: '.date('d/m/Y',strtotime ( $auth_date ));
$newdate = strtotime ( '+5 year' , strtotime ( $auth_date ) ) ; 
(string)$newdate = date ( 'd/m/Y' , $newdate ); 
inviando 11/09/2011 stampi "Data letta: 09/11/2011"

Usando gli oggetti DateTime potresti fare così:

Codice: Seleziona tutto

<?php

$auth_date = new DateTime($this->data_autorizzazione, new DateTimeZone('Europe/Rome'));

echo $auth_date->format('d/m/Y')."\n";

$auth_date->modify('+5 years');

echo $auth_date->format('d/m/Y')."\n";
Impostando DateTimeZone a Europe/Rome verrà riconosciuto il formato d/m/Y.
Ultima modifica di Zoff il venerdì 9 settembre 2011, 0:49, modificato 1 volta in totale.
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
wais
Prode Principiante
Messaggi: 34
Iscrizione: lunedì 5 settembre 2011, 14:35

Re: [PHP] - Somma data, valore inaspettato

Messaggio da wais »

@zoff perfetto, proverò gli oggetti datetime appena torno a casa; una curiosità, passandogli come parametro l'oggetto

Codice: Seleziona tutto

new DataTimeZone('Europe/Rome')
dovrebbe riconoscermi il formato d/m/Y, se è così a che serve chiamare il metodo

Codice: Seleziona tutto

format('d/m/y')
su $auth_date?

Un altra cosa, nel codice da me postato nel primo post utilizzo strtotime() aggiungendo +5 all anno, ma per valori di input come 11/09/2011 ottengo 09/11/2016, volevo capire quanto è affidabile questo risultato.
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [PHP] - Somma data, valore inaspettato

Messaggio da Zoff »

wais ha scritto: @zoff perfetto, proverò gli oggetti datetime appena torno a casa; una curiosità, passandogli come parametro l'oggetto

Codice: Seleziona tutto

new DataTimeZone('Europe/Rome')
dovrebbe riconoscermi il formato d/m/Y, se è così a che serve chiamare il metodo

Codice: Seleziona tutto

format('d/m/y')
su $auth_date?
Passando un oggetto DateTimeZone gli dici come leggere la data passata. Poi questa viene memorizzata al suo interno nella maniera che gli sviluppatori PHP hanno preferito.
Il metodo format() serve per ottenere una rappresentazione in stringa della data, quindi anche se hai letto d/m/Y puoi poi avere una stringa nel formato che preferisci.
wais ha scritto: Un altra cosa, nel codice da me postato nel primo post utilizzo strtotime() aggiungendo +5 all anno, ma per valori di input come 11/09/2011 ottengo 09/11/2016, volevo capire quanto è affidabile questo risultato.
Non ti ho risposto sopra?
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti