私は Stata のJava APIを利用しようとしている Stata ユーザーです。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")
ただし、結果は本来よりも 1 時間早くなります。
. 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());
これを行う簡単な方法はありますか?