2014-12-20 23 views
7

Ho una variabile denominata date1 che contiene un oggetto data/ora ColdFusion generato utilizzando parseDateTime. Quando scarico la variabile ottengo {ts '2014-12-20 15:46:57'}.dataDiff restituisce il valore errato

Ho un'altra variabile denominata date2 che contiene un altro oggetto data/ora ColdFusion generato da dateConvert("local2utc",now()). Quando scarico la variabile ottengo {ts '2014-12-20 15:49:40'}.

Ma quando faccio dateDiff("s",date1,date2) ottengo -21436 che è di gran lunga troppi secondi. Qualcuno può spiegare perché questo accada? Penso che potrebbe essere un problema di fuso orario ma non riesco a capirlo.

codice Repro

<cfset dtString = "Saturday, December 20, 2014 05:07:30 PM"> 

<cfset dtObject = parseDateTime(dtString)> 

<cfdump var="#dtObject#"> 

<cfset utcNow = dateConvert("local2utc",now())> 

<br><br><cfdump var="#utcNow#"> 

<br><br><cfdump var="#dateDiff("s",dtObject,utcNow)#"> 
+1

Puoi pubblicare un caso di riproduzione che possiamo copiare incollare per ricreare il problema? –

+0

No, non possiamo commentare in un modo o nell'altro senza vedere un caso di riproduzione che mostri ciò che stai vedendo. Pls leggi questo e il link ai documenti: http://blog.adamcameron.me/2013/09/short-self-contained-correct-compilable.html –

+4

Sospetto che tu sia in una TZ che è UTC-6? Se cerchi google nella base dei bug di CF (https://www.google.co.uk/search?q=bugbase.adobe.com+dateConvert) ci sono stati un sacco di problemi con dateConvert(), che sembrano essere più o meno gli stessi orari di quello che stai vedendo. Adobe dichiara di averlo corretto, ma non sarei mai stato così sicuro di loro. Sospetto che il tuo primo appuntamento sia nella tua TZ locale e che la seconda sia in UTC, quindi stai ricevendo quell'offset riflesso nei risultati dateAdd(). Per quanto riguarda il motivo per cui non vedi il TZ diff in ''? Boh. Non mi sorprende però. –

risposta

6

La causa di questo problema sembra essere dovuto al bug descritto in https://bugbase.adobe.com/index.cfm?event=bug&id=3338974.

Come descritto nell'URL precedente, "la variabile restituita da DateConvert (" local2Utc ", now()) sembra trasportare l'offset da locale a UTC. Quando, si usa quella variabile per qualsiasi cosa (incluso cfqueryparam), il valore che si ottiene è off per la quantità dell'offset (cioè al valore passato).

Una soluzione sembra essere quella di convertire la data in una stringa dopo la conversione. Ho creato una semplice funzione wrapper per questo come segue:

<cffunction name="local2utc" output="no"> 
    <cfargument name="date"> 

    <cfreturn dateConvert("local2utc",arguments.date).toString()> 

</cffunction> 
Problemi correlati