getmtime differs between Py2.5 and Py2.4

Tony Meyer tony.meyer at gmail.com
Tue May 8 01:11:13 EDT 2007


On May 8, 10:15 am, "Martin v. Löwis" <mar... at v.loewis.de> wrote:
> that you are mistaken: There is NO difference between the outcome
> of os.path.getmtime between Py2.5 and Py2.4. It always did return
> UTC, and always will.

In revision 42230, you checked in a change to posixmodule.c with the
following code comment:

/* The CRT of Windows has a number of flaws wrt. its stat()
implementation:
  	    - time stamps are restricted to second resolution
  	    - file modification times suffer from forth-and-back
conversions between
  	      UTC and local time
  	    Therefore, we implement our own stat, based on the Win32 API
directly.
*/

(See http://svn.python.org/view/python/trunk/Modules/posixmodule.c?rev=42230&view=log
)

Different results are indeed obtained, as others have demonstrated
(other than the irrelevant float/int distinction).  The following C
sample program illustrates:

C:\>a d:\temp.txt
Time modified : Thu Feb 08 10:08:44 2007
Time modified : 02/07/2007 22:08:44 UTC
Time modified : 02/08/2007 11:08:44 Local

C:\>c:\python24\python -c "import os;import time;print
time.ctime(os.path.getmtime('temp.txt'))"
Thu Feb 08 10:08:44 2007

C:\>c:\python25\python -c "import os;import time;print
time.ctime(os.path.getmtime('temp.txt'))"
Thu Feb 08 11:08:44 2007

(My local time is UTC-12).

This doesn't happen with every file:

C:\>c:\python24\python -c "import os;import time;print
time.ctime(os.path.getmtime('temp2.txt'))"
Tue May 08 16:59:22 2007

C:\>c:\python25\python -c "import os;import time;print
time.ctime(os.path.getmtime('temp2.txt'))"
Tue May 08 16:59:22 2007

C:\>a d:\temp2.txt
Time modified : Tue May 08 16:59:22 2007
Time modified : 05/08/2007 04:59:22 UTC
Time modified : 05/08/2007 16:59:22 Local

A key fact here, I believe, is that in February (when temp.txt was
last modified), my local time was UTC-11.  I expect this is the
suffering that your comment in posixmodule.c refers to (it looks to me
like Python 2.5 is correct).

Cheers,
Tony

---
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <windows.h>

int main( int argc, char **argv )
{
   WIN32_FILE_ATTRIBUTE_DATA lpFileInformation;
   SYSTEMTIME stUTC, stLocal;
   struct __stat64 buf;
   int result;

   /* Python 2.4 style */
   result = _stat64( argv[1], &buf );
   if( result != 0 )
      perror( "Problem getting information" );
   else
      printf( "Time modified : %s", _ctime64( &buf.st_mtime ) );

   /* Python 2.5+ */
   GetFileAttributesEx(argv[1], GetFileExInfoStandard,
&lpFileInformation);
   FileTimeToSystemTime(&lpFileInformation.ftLastWriteTime, &stUTC);
   printf("Time modified : %02d/%02d/%d %02d:%02d:%02d UTC\n",
stUTC.wMonth, stUTC.wDay, stUTC.wYear,
       stUTC.wHour, stUTC.wMinute, stUTC.wSecond);
   SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);
   printf("Time modified : %02d/%02d/%d %02d:%02d:%02d Local\n",
stLocal.wMonth, stLocal.wDay, stLocal.wYear,
       stLocal.wHour, stLocal.wMinute, stLocal.wSecond);
}




More information about the Python-list mailing list