2014-12-20 16 views
7

Mam zmienną o nazwie date1, która zawiera obiekt daty/czasu ColdFusion wygenerowany przy użyciu parseDateTime. Po zrzuceniu zmiennej otrzymuję {ts '2014-12-20 15:46:57'}.dateDiff zwraca nieprawidłową wartość

Mam inną zmienną o nazwie date2, która zawiera inny obiekt daty/czasu ColdFusion wygenerowany przez dateConvert("local2utc",now()). Kiedy zrzucam zmienną, otrzymuję {ts '2014-12-20 15:49:40'}.

Ale kiedy robię dateDiff("s",date1,date2) otrzymuję -21436, który jest o wiele za dużo sekund. Czy ktoś może wyjaśnić, dlaczego tak się dzieje? Myślę, że to może być kwestia strefy czasowej, ale nie mogę się z tym pogodzić.

kod 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

Czy możesz opublikować repro case, aby skopiować kopię, aby odtworzyć problem? –

+0

Nie, nie możemy komentować w ten czy inny sposób, nie widząc przypadku repro, który demonstruje to, co widzisz. Pls przeczytają to i są powiązane z dokumentami: http://blog.adamcameron.me/2013/09/shortself-contained-correct-compilable.html –

+4

Podejrzewam, że jesteś w TZ czyli UTC-6? Jeśli zgłosisz do Google bazę błędów CF (https://www.google.co.uk/search?q=bugbase.adobe.com+dateConvert), pojawiło się kilka problemów z funkcją dateConvert(), które wydają się być w tym samym czasie tego, co widzisz. Adobe twierdzi, że je naprawił, ale nigdy nie byłbym z nich tak pewny. Podejrzewam, że twoja pierwsza randka jest w twojej lokalnej TZ, a druga w UTC, więc otrzymujesz to przesunięcie odzwierciedlone w wynikach dateAdd(). Dlaczego nie widzisz diff TZ w ''? Dunno. Nie zaskakuje mnie jednak. –

Odpowiedz

6

Przyczyną tego problemu wydaje się być wynikiem błędu opisanego w https://bugbase.adobe.com/index.cfm?event=bug&id=3338974.

Zgodnie z opisem pod powyższym adresem URL "zmienna zwrócona przez DateConvert (" local2Utc ", teraz()) wydaje się przenosić przesunięcie z lokalnego na UTC. Kiedy użyjesz tej zmiennej dla prawie wszystkiego (w tym cfqueryparam), wartość, którą otrzymasz, jest wyłączona przez wartość przesunięcia (to znaczy z powrotem do wartości, którą przekazałeś).

Wydaje się, że obejście problemu polega na przekonwertowaniu daty na ciąg znaków po konwersji. Stworzyłem prostą funkcję owijania w następujący sposób:

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

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

</cffunction>