文件的最后修改返回到Stata的时间

Mat*_*ite 6 java stata

我是一个Stata用户,试图利用Stata的Java API。我想使用Java将文件的最后修改时间返回给Stata。但是,我认为我遇到了时区问题。

非Stata用户的Stata中的时间快速背景:时间由以来的毫秒数表示January 1, 1960 00:00:00.000。Stata没有时区,因此我希望Java函数的返回值是January 1, 1960我所在时区(美国/纽约)午夜以来的毫秒数。

这是我对Java函数的尝试(如果有帮助,我可以将其完整发布):

import com.stata.sfi.*;
// Other imports

public class SFileAttribs
{
    // Syntax: lastModified(String filename, String scalar_name)
    // Stores in the Stata scalar scalar_name the time of last
    // modification of filename.
    public static int lastModified(String[] args)
    {
        // Code here...

        // Get the time.
        FileTime time;
        try {
            time = (FileTime) Files.getAttribute(path, "lastModifiedTime");
        }
        catch (IOException e) {
            SFIToolkit.errorln("file I/O error on read");
            return(692);
            /*NOTREACHED*/
        }

        // Store the time in the scalar.
        Calendar cal1960 = Calendar.getInstance();
        cal1960.set(1960, 0, 1, 0, 0, 0);
        cal1960.set(Calendar.MILLISECOND, 0);
        Scalar.setValue(args[1], time.toMillis() - cal1960.getTimeInMillis());

        return(0);
    }
}
Run Code Online (Sandbox Code Playgroud)

回到Stata,我运行以下命令:

// Calls SFileAttribs.lastModified("Test.txt", "filetime").
javacall SFileAttribs lastModified, args("Test.txt" "filetime")
Run Code Online (Sandbox Code Playgroud)

但是,结果比原先要早一个小时:

. display %tc filetime
24oct2013 12:54:36
Run Code Online (Sandbox Code Playgroud)

我所在时区的最后修改时间13:54不是12:54

我真的在这个问题上苦苦挣扎,并希望得到任何建议。


编辑:

也许可以预见,因为我来自没有时区的语言,所以我认为自己浪费了夏令时。在我的时区中,现在是DST,但在的相同时区中January 1, 1960,它不是DST。我需要考虑到这一点:

// Store the time in the scalar.
Calendar now = Calendar.getInstance();
Calendar cal1960 = Calendar.getInstance();
cal1960.set(1960, 0, 1, 0, 0, 0);
cal1960.set(Calendar.MILLISECOND, 0);
int dstHour = (cal1960.getTimeZone().inDaylightTime(cal1960.getTime()) ? 1 : 0) -
        (now.getTimeZone().inDaylightTime(now.getTime()) ? 1 : 0);
cal1960.set(Calendar.HOUR, dstHour);
Scalar.setValue(args[1], time.toMillis() - cal1960.getTimeInMillis());
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法可以做到这一点?