From: Axel Friedrich Date: 2006-03-31T15:13:43+09:00 Subject: File.mtime: Bug on Windows? Hello, I think, there is a bug in File.mtime, unfortunately: Using: ruby 1.8.4 (2005-12-24) [i386-mswin32] Windows XP with NTFS filesystem When reading File.mtime( 'any existing filename'), the result is different by one hour, when doing this with the computer clock set to a daylight saving time (DST) and doing this with the computer clock set to a standard time. A simple test can be done with this: fn = 'any existing filename' # change this! p Time.now t = File.mtime( fn ) puts "File.mtime = " + t.to_s puts "File.mtime.to_i = " + t.to_i.to_s t.utc puts "utc: " + t.to_s puts "utc.to_i = " + t.to_i.to_s On Windows 98SE with FAT32 filesystem, I do *not* get this bug. I supose, this is related to what is descriped here: http://search.cpan.org/~shay/Win32-UTCFileTime- 1.45/lib/Win32/UTCFileTime.pm (Thank you very much to Daniel Berger for pointing me to this!) This made it difficult for me to compare filetimes. I like programming with Ruby very much, hence I would be glad to have this working OK. Axel PS.: If you like to have a more elaborated code for checking this, you may take this: puts <<-HERE Step 1: Set computer-clock to Summer Time (DST), manualy. Step 2: Create 2 files, first file with mtime set to Winter Time, second file with mtime set to Summer time. Step 3: Set computer-clock to Winter Time (not DST), manualy. Step 4: Create another 2 files, first file with mtime set to Winter Time, second file with mtime set to Summer time. Read File.mtime and File.mtime.to_i from all 4 files Keep a copy of the result. Step 5: Set computer-clock to Summer Time (DST); Read File.mtime and File.mtime.to_i from all 4 files Step 6: Compare the result by visual inspection Step 7: Delete the obsolet files HERE $stdout.sync = true puts "Enter step No. please [1..7]: " step = gets.chomp case step.to_i when 1 puts "Set computer-clock to Summer Time (DST) now!" puts "Computer is set to: " + Time.now.to_s when 2 puts "Creating files:" p timeInWinter = Time.mktime( 2005, 12 ) p timeInSummer = Time.mktime( 2005, 7 ) filename = 'c:/SetInSummer2TimeInWinter.txt' File.open( filename, 'w' ) { } File.utime(timeInWinter, timeInWinter, filename ) filename = 'c:/SetInSummer2TimeInSummer.txt' File.open( filename, 'w' ) { } File.utime(timeInSummer, timeInSummer, filename ) when 3 puts "Set computer-clock to Winter Time (not DST) now!" puts "Now: " + Time.now.to_s when 4 puts "Creating files:" p timeInWinter = Time.mktime( 2005, 12 ) p timeInSummer = Time.mktime( 2005, 7 ) filename = 'c:/SetInWinter2TimeInWinter.txt' File.open( filename, 'w' ) { } File.utime(timeInWinter, timeInWinter, filename ) filename = 'c:/SetInWinter2TimeInSummer.txt' File.open( filename, 'w' ) { } File.utime(timeInSummer, timeInSummer, filename ) puts "Now reading file times: " puts "Computer is set to: " + Time.now.to_s p filename = 'c:/SetInSummer2TimeInWinter.txt' puts "File.mtime" + File.mtime( filename ).to_s puts "File.mtime.to_i = " + File.mtime( filename ).to_i.to_s t = File.mtime( filename ) t.utc puts "utc: " + t.to_s puts "utc.to_i = " + t.to_i.to_s puts p filename = 'c:/SetInSummer2TimeInSummer.txt' puts "File.mtime" + File.mtime( filename ).to_s puts "File.mtime.to_i = " + File.mtime( filename ).to_i.to_s t = File.mtime( filename ) t.utc puts "utc: " + t.to_s puts "utc.to_i = " + t.to_i.to_s puts p filename = 'c:/SetInWinter2TimeInWinter.txt' puts "File.mtime" + File.mtime( filename ).to_s puts "File.mtime.to_i = " + File.mtime( filename ).to_i.to_s t = File.mtime( filename ) t.utc puts "utc: " + t.to_s puts "utc.to_i = " + t.to_i.to_s puts p filename = 'c:/SetInWinter2TimeInSummer.txt' puts "File.mtime" + File.mtime( filename ).to_s puts "File.mtime.to_i = " + File.mtime( filename ).to_i.to_s t = File.mtime( filename ) t.utc puts "utc: " + t.to_s puts "utc.to_i = " + t.to_i.to_s puts when 5 puts "Set computer-clock to Summer Time (DST) now!" puts "Computer is set to: " + Time.now.to_s when 6 puts "Now reading file times: " puts "Computer is set to: " + Time.now.to_s p filename = 'c:/SetInSummer2TimeInWinter.txt' puts "File.mtime" + File.mtime( filename ).to_s puts "File.mtime.to_i = " + File.mtime( filename ).to_i.to_s t = File.mtime( filename ) t.utc puts "utc: " + t.to_s puts "utc.to_i = " + t.to_i.to_s puts p filename = 'c:/SetInSummer2TimeInSummer.txt' puts "File.mtime" + File.mtime( filename ).to_s puts "File.mtime.to_i = " + File.mtime( filename ).to_i.to_s t = File.mtime( filename ) t.utc puts "utc: " + t.to_s puts "utc.to_i = " + t.to_i.to_s puts p filename = 'c:/SetInWinter2TimeInWinter.txt' puts "File.mtime" + File.mtime( filename ).to_s puts "File.mtime.to_i = " + File.mtime( filename ).to_i.to_s t = File.mtime( filename ) t.utc puts "utc: " + t.to_s puts "utc.to_i = " + t.to_i.to_s puts p filename = 'c:/SetInWinter2TimeInSummer.txt' puts "File.mtime" + File.mtime( filename ).to_s puts "File.mtime.to_i = " + File.mtime( filename ).to_i.to_s t = File.mtime( filename ) t.utc puts "utc: " + t.to_s puts "utc.to_i = " + t.to_i.to_s puts when 7 puts "Deleting all files..." p filename = 'c:/SetInSummer2TimeInWinter.txt' File.delete( filename ) p filename = 'c:/SetInSummer2TimeInSummer.txt' File.delete( filename ) p filename = 'c:/SetInWinter2TimeInWinter.txt' File.delete( filename ) p filename = 'c:/SetInWinter2TimeInSummer.txt' File.delete( filename ) else puts "Choose a number from 1 to 7" end