CoreLabView系统中文件最后修改时间的问题及解决方案

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),再看,果然对了,有图为证:

 

 

 

一行代码解决,应该是最完美的。

你可能感兴趣的:(jdk,tomcat,linux,Security,Access)