|
でるもんた・いいじまです。
秀丸担当さん:
> それか、マクロとしてCOMなどの外部に頼らず
> 標準で日付を取得する関数があると、他にも
> 用途がありそうでいいかもしれません。
> とりあえず標準の取得も検討しようと思います。
stythさん:
> よろしくお願いいたします。
ついでにですが、「現在の日付・時刻を取得する手段」と「sleep文」も可能であれ
ばよろしくお願いします。
☆ ☆ ☆
とりあえず、日時のデータ形式は今のうちに検討しておいたほうがよさそうです。
32bit整数版の秀丸でも使えるように、ということならUNIX Time(1970.01.01 00:00
GMTからの経過秒数)ですが、これは現時点で既に 0x40000000 を超えている。
NTFSの内部データは 1600.01.01 00:00 からの経過時間を100ms単位で記録していま
すが、それだと32bit版や、あるいは浮動小数点モードでは扱えない。
で、このどちらを使うにしても、「年月日時分秒」の形式に換算する方法が必要です。
☆ ☆ ☆
それと、現在時刻以外にも日時関係の機能が一通りあったら便利かなと思います。具
体的な仕様は上記の「ファイルのタイムスタンプを取得する方法」とも絡むので早急
に詰めないといけないのですが、一つの案を書いてみます。
@「日時の値」や「日時どうしの差分」は、秀丸の内部ではWin32APIのFILETIME型と
して扱い、マクロに対しては何らかの形でASCII文字列にエンコードして返す。sprin
tf() の "%016llX" 書式が簡便だと思います。(そのままsscanf() でデコードでき
ますし。)
A下記の関数を用意。
// 日時シリアル値を取得。
// ::GetSystemTimeAsFileTime() をそのまま返す。
$time = currentdatetime;
// 各パラメータから日時シリアル値を生成。
// 下記の案では、パラメータの並び順はWin32のSYSTEMTIME型と同じ。
// 受け取った値は、何らかの方法で正規化してから
// (たとえば標準Cのmktime()とlocaltime()を使う)
// ::SystemTimeToFileTime() に渡す。
$time = makegmtime(#year, #mon, #day, 0, #hour, #min, #sec, #msec);
$time = makelocaltime(#year, #mon, #day, 0, #hour, #min, #sec, #msec);
// 日時シリアル値を年月日・時分秒にバラす。
#status = getgmtime($time, #result[]);
#status = getlocaltime($time, #result[]);
// 日時シリアル値の計算。
// timediff($t1, $t2) は timeadd($t1. "-"+"$t2) で代用してもよさそう。
$time = timediff($t1, $t2); // 引き算
$time = timeadd($t1, $t2[, $t3...]) // 足し算
$time = timemuldiv($t, #mult, #div); // 掛け算・割り算
// 日時シリアル値を指定の単位の(正負の)数値に変換。
// $unitには少なくとも "d","h","m","s","ms"が指定可能。
// 他に "us","ns","raw" もあると便利になりそうだし、
// "10ms"のような指定もできるようになると楽でいい。
#num = timeserial($time, $unit);
Bstrftime()は既存のPOSIXの仕様に合わせて実装しても使い勝手があまりよくない
ので、要望が出るまで後回しでいいかと。
☆ ☆ ☆
以上となります。こちらも一つの案としてご検討いただければ幸いです。
|
|