File.utime, Windows and Ruby 1.8

M

mike

The behavior of Fime.utime on Ruby 1.8 on Windows looks wrong:

H:\devel>type test_mtime.rb
time = Time.local(2000, 1, 1, 0, 0, 0)
file = "foo.txt"
File.open(file, "w") {}
File.utime time, time, file
puts time.to_f
puts File.mtime(file).to_f

H:\devel>c:\ruby1.8\bin\ruby.exe -v test_mtime.rb
ruby 1.8.2 (2004-12-25) [i386-mswin32]
946681200.0
946684800.0

The file's mtime is 1 hour later. Using Time.gm doesn't fix the
problem.

Compare with Ruby 1.6, which looks good:
H:\devel>c:\ruby\bin\ruby.exe -v test_mtime.rb
ruby 1.6.7 (2002-03-01) [i386-mingw32]
946681200.0
946681200.0

I don't know if it's related, but I'm using a FAT32 filesystem.


mike
 
S

Shad Sterling

The behavior of Fime.utime on Ruby 1.8 on Windows looks wrong: ...
The file's mtime is 1 hour later. Using Time.gm doesn't fix the
problem. ...
I don't know if it's related, but I'm using a FAT32 filesystem.
=20
=20
mike
=20
=20

I see the same thing, using CIFS to a samba server. I just changed
File.utime in my quirks.rb:

class File
if RUBY_PLATFORM.split("-")[1] =3D=3D "mswin32" then
#puts "fixing win32 File.utime bug"
class << self
alias_method :broken_utime, :utime
def File.utime( atime, mtime, filename )
File.broken_utime( atime, mtime-3600, filename )
end
end
end
end




--=20
 
N

nobu.nokada

Hi,

At Mon, 9 May 2005 18:19:34 +0900,
mike wrote in [ruby-talk:141817]:
H:\devel>c:\ruby1.8\bin\ruby.exe -v test_mtime.rb
ruby 1.8.2 (2004-12-25) [i386-mswin32]
946681200.0
946684800.0

The file's mtime is 1 hour later. Using Time.gm doesn't fix the
problem.

It seems like related to DST.


Index: win32/win32.c
===================================================================
RCS file: /cvs/ruby/src/ruby/win32/win32.c,v
retrieving revision 1.148
diff -U2 -p -r1.148 win32.c
--- win32/win32.c 14 May 2005 14:57:04 -0000 1.148
+++ win32/win32.c 15 May 2005 00:43:06 -0000
@@ -3491,4 +3491,5 @@ unixtime_to_filetime(time_t time, FILETI
struct tm *tm;
SYSTEMTIME st;
+ FILETIME lt;

tm = gmtime(&time);
@@ -3501,5 +3502,6 @@ unixtime_to_filetime(time_t time, FILETI
st.wSecond = tm->tm_sec;
st.wMilliseconds = 0;
- if (!SystemTimeToFileTime(&st, ft)) {
+ if (!SystemTimeToFileTime(&st, &lt) ||
+ !LocalFileTimeToFileTime(&lt, ft)) {
errno = map_errno(GetLastError());
return -1;
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,994
Messages
2,570,223
Members
46,813
Latest member
lawrwtwinkle111

Latest Threads

Top