【问题标题】:Returning time of last modification of file to Stata文件最后修改时间返回Stata
【发布时间】:2013-10-24 18:00:55
【问题描述】:

我是一名 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);
    }
}

回到 Stata,我运行这个命令:

// Calls SFileAttribs.lastModified("Test.txt", "filetime").
javacall SFileAttribs lastModified, args("Test.txt" "filetime")

但是,结果比应有的时间早了一个小时:

. display %tc filetime
24oct2013 12:54:36

我所在时区的最后修改时间是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());

有更简单的方法吗?

【问题讨论】:

    标签: java stata


    【解决方案1】:

    community-contributed 命令filesys 是完全按照您的意愿行事的最简单方法:

    . findfile auto.dta
    . filesys `r(fn)', attributes
    
    . return list
    
    macros:
    (some output omitted)
    
            r(accessednum) : "1871843910000"
            r(modifiednum) : "1745362526000"
             r(creatednum) : "1745362526000"
               r(accessed) : "25apr2019 20:38:30"
               r(modified) : "22apr2015 22:55:26"
                r(created) : "22apr2015 22:55:26"
    
    . display %tcHH:MM `r(modifiednum)'  
    22:55
    

    您可以使用以下命令安装 filesys 命令 社区贡献命令github:

    . net install github, from("https://haghish.github.io/github/")
    . github install wbuchanan/StataFileSystem
    

    【讨论】:

      猜你喜欢
      • 2018-03-07
      • 1970-01-01
      • 2016-09-06
      • 2011-12-03
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      相关资源
      最近更新 更多