c ++ - Hvorfor er det \_localtime32 og \_gmtime32 returnere samme tidsværdi for en tidszone uden for GMT?

Indlæg af Hanne Mølgaard Plasc

Problem



Min tidszone er indstillet til CDT i kontrolpanelet Date/Time-applet.


Følgende kode placerer præcis samme dato og klokkeslæt i pCurGmtTime og pCurTime:


int main(int argc, char *argv[])
{
  \_\_time32\_t t=\_time32(NULL);

  tm *pCurGmtTime=\_gmtime32(&t);
  tm *pCurTime=\_localtime32(&t);

  // The values in the *pCurGmtTime structure are equal to the values in *pCurTime

  return 0;
}


Jeg har ikke TZ miljøvariabler indstillet, men min tidszone er korrekt konfigureret til systemet via kontrolpanel Dato og klokkeslæt-applet. Denne adfærd synes at gå imod MSDN-dokumentationen for disse funktioner, hvilket siger at TZ tilsidesætter kontrolpanelets indstillinger, men hvis det ikke er muligt, vil kontrolpanelets indstillinger blive brugt.


Tak

Bedste reference


Fordi



  Både 32-bit og 64-bit versioner af gmtime, mktime, mkgmtime og lokaltime bruger alle en enkelt tm struktur per tråd til konverteringen.



Det andet opkald skriver data til samme sted som den forrige. Du skal kopiere dataene et andet sted, før du ringer til localtime.

Andre referencer 1


Fordi pegeren vender tilbage af begge disse opkald peger på den samme indre struktur:


http://msdn.microsoft.com/en-us/library/bf12f0hc(v=vs.80).aspx[11]



  Både 32-bit og 64-bit versioner af gmtime, mktime, mkgmtime og lokaltime bruger alle en enkelt tm struktur per tråd til konverteringen. Hvert opkald til en af ​​disse rutiner ødelægger resultatet af det foregående opkald.



Dit andet opkald (\_localtime32()) overskriver værdierne fra det første opkald. Hvis du skulle sammenligne pointerværdierne selv, så ser du de var de samme.


Hvis du bruger \_s versionerne som nævnt øverst i dokumenterne, vandt du ikke det problem, som du skal passere i din egen struct *tm.