CoreLabView在显示文件Date Modified属性的时候不对:
文件_site001.csv是今天07/10/2008中午12:15(上海)上传的,用putty登上位于Rockville的服务器ralph看到文件修改时间为
2008-07-10 00:15:13.000000000 -0400, 这是对的。
[tomcat@ralph 395]$ pwd /usr/local/apache-tomcat-6.0.16-clv/CoreLabView/CoreLabView/WEB-INF/coreviewFileHome/input/93/395 [tomcat@ralph 395]$ ls _site001.csv [tomcat@ralph 395]$ stat _site001.csv File: `_site001.csv' Size: 28353 Blocks: 64 IO Block: 4096 regular file Device: 903h/2307d Inode: 3326122 Links: 1 Access: (0666/-rw-rw-rw-) Uid: ( 503/ tomcat) Gid: ( 502/ tomcat) Access: 2008-07-10 02:57:23.000000000 -0400 Modify: 2008-07-10 00:15:13.000000000 -0400 Change: 2008-07-10 00:15:13.000000000 -0400
但是web页面上显示的却是Fri Jul 11 00:15:13 UTC +0800 2008和07/10/2008 12:15:13 -0400
差了整整12小时!
查看JDK的src, 发现有4处相关代码:
1. java.io.File
public long lastModified() { SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkRead(path); } return fs.getLastModifiedTime(this); }
2. java.io.FileSystem
public abstract long getLastModifiedTime(File f);
3. java.io.Win32FileSystem
public native long getLastModifiedTime(File f);
4. java.io.WinNTFileSystem
public native long getLastModifiedTime(File f);
这是windows下的JDK源代码,Linux下应该也差不多,就不去看了 -- 实际上看了也没用。
为什么读到的是错误的时间呢?我判断是时区信息弄错了
另一个有意思的现象是,在ralph上手工创建的文件的修改时间却是对的 -- 真是本地的和尚好念经啊,上海传到Rockville的文件时间就是差12小时。
在代码中调整时区?这明显是个馊得发臭的主意,因为文件并不限于在上海上传,加拿大、德国、波兰以及中国都可以上传,我们怎么计算时间差?反而把问题弄复杂了。
我又想,既然“在ralph上手工创建的文件的修改时间却是对的”,那如果我在代码中加一行
// Code added by Sam Chen on 07/10/2008 14:48 ==> file.setLastModified(new java.util.Date().getTime()); // Code added by Sam Chen on 07/10/2008 14:48 <==
让文件上传完成后就把修改时间设成当前的服务器上的时间,会怎么样呢?这样在任何地方(月球,火星等地暂时不行)访问,时间都应该是正确的(转成当地时间)
从上海上传文件_site002.csv(上传时间今天14:55),再看,果然对了,有图为证:
一行代码解决,应该是最完美的。