PDA

View Full Version : [JAVASCRIPT / PHP] La somma dei mesi non coincide fra i 2 linguaggi


jeremy.83
01-06-2018, 09:36
Saluti a tutti,

volevo proporre una specie di sondaggio

Ho questo codice PHP

$d = DateTime::createFromFormat("Y/m/d", "2017/08/30");
$interval = new DateInterval("P18M");
$d->add($interval);


E il suo "duale" in javascript

var d = moment("2017/08/30", "YYYY/MM/DD");
d.add(18, "months");


Vabbè qui ho usato moment, ma è la stessa cosa che usare Date e i suoi metodi

Entrambi gli spezzoni di codice aggiungono 18 mesi al 30 agosto 2017, utilizzando praticamente gli stessi oggetti che i 2 linguaggi mettono a disposizione

Il PHP mi ritorna 2 marzo 2019
Il Javascript ritorna invece 28 febbraio 2019

Ovviamente devo fare in modo che da entrambi i linguaggi si ottenga lo stesso risultato, e una soluzione l'avrei già trovata.

Senza dirvi cosa ho scelto io, vi chiedo quale scegliereste "a logica" fra i 2 risultati

Ciao!

les2
01-06-2018, 10:48
$time = strtotime("2017/08/30");
$final = date("Y/m/d", strtotime("+18 month", $time));


dà lo stesso risultato?
e in js ?


var dt1 = new Date(2017, 08, 30);
var dt2 = dt1.setMonth(dt1.getMonth()+18);

jeremy.83
01-06-2018, 12:11
$time = strtotime("2017/08/30");
$final = date("Y/m/d", strtotime("+18 month", $time));


dà lo stesso risultato?
e in js ?


var dt1 = new Date(2017, 08, 30);
var dt2 = dt1.setMonth(dt1.getMonth()+18);


In PHP, come immaginavo, usare functional o object oriented il risultato non cambia, si ottiene sempre 2 marzo 2019

In Javascript, con quel codice che mi hai quotato, fatte alcune modifiche perchè setMonth non ritorna un oggetto Date (ma vabbè, presumo tu abbia scritto il codice così a getto), addirittura mi propone 30 marzo 2019

In generale non conviene utilizzare l'oggetto puro javascript Date perchè si porta dietro mille problemi, come questo, ma conviene usare lib come Moment.js o Date.js, come ho effettivamente usato.

La domanda rimane aperta

Saluti

Mursey
03-06-2018, 17:01
Per prima cosa va chiarito che soluzione ti aspetti, nella vita di tutti giorni dire 18 mesi dopo il 30 agosto 2017 vuol dire il 28 febbraio 2019

Quindi il risultato corretto sarebbe quello di Javascript con Moment.js...

jeremy.83
04-06-2018, 09:17
Per prima cosa va chiarito che soluzione ti aspetti, nella vita di tutti giorni dire 18 mesi dopo il 30 agosto 2017 vuol dire il 28 febbraio 2019

Quindi il risultato corretto sarebbe quello di Javascript con Moment.js...

Anch'io la penso esattamente come te, e infatti ho adattato il PHP in modo che si comporti come il javascript.

Il mio intento era di verificare quanti siamo a pensarla allo stesso modo, e magari una risposta al perchè PHP si comporti in questa maniera.

les2
14-06-2018, 12:21
Ciao,
sì ho scritto ovviamente senza provarlo (copia incolla al volo)


allora, per me è "giusto" php o meglio per avere la stessa cosa bisogna farla in modo differente.

tu stai cercando una data + n mesi, ma non è l'inizio mese.


Quindi dovresti cercare ad esempio + 19 mesi - 1 giorno, no?
se è questo quello che vuoi (ovvero il 28 o 29 febbraio)



probabilmente il comodissimo moment.js lo fa da solo
a memoria non so assolutamente chi fa cosa e come, guardo di volta in volta in base alla necessità, sicuramente librerie come moment.sj in php non ci sono ma non significa che non si possano far ele cose :P

spero di averti aiutato, scusa il ritardo