BBS-complangawk/325

トップ 差分 一覧 Farm ソース 検索 ヘルプ RSS ログイン

any buitin time function mawk? - Timoteo (2006年07月09日 22時49分06秒)

mawk で時間関数を使うには?

http://groups.google.co.jp/group/comp.lang.awk/browse_frm/thread/ed7c78e772f8977c/89defd26ac473f76?hl=ja#89defd26ac473f76


Re: - Harlan Grove (2006年07月09日 22時50分07秒)

mawk のソースコードを触るか、外部からのパイプで使うかしかありません。

Re: - John DuBois? (2006年07月09日 22時50分57秒)

srand() が現在の時刻を返すことから利用することができます。

補足 - さいとう (2006年07月09日 22時56分08秒)

John DuBois? の方法は「AWK を 256 倍使うための本」の中に出ています。ソースコードは以下の URL から現在も入手可能です。(ありがたや)

以下のようなソースとなっていますが、srand() が現在の時間を返しているというのはコンパイルした環境に依存しますので、全ての mawk で使えるわけではありません。

# GETDATE (Get today)
func GetDate(val,		leap) {
	if("" == _MonName[1]) {
		_TimeZone = 9 * 3600
		split("Sun Mon Tue Wed Thu Fri Sat", _WeekName, " ")
		split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec", 
                      _MonName, " ")
		split("31 28 31 30 31 30 31 31 30 31 30 31 31 29 31 30 31 30 31 31 30 31 30 31", _MonLen, " ")
	}

	if(0 == val + 0) {
		srand()
		Time = srand() + _TimeZone
	} else {
		Time = val
	}

	Sec  = Time % 60
	Min  = int(Time / 60  ) % 60
	Hour = int(Time / 3600) % 24
	Day  = int(Time / (3600 * 24))
	Week = (Day + 4) % 7 + 1
	Year = 1970;
	for(++Day;;) {
		leap = ((Year%4)==0 && (Year%100)!=0 || (Year%400)==0) ? 12: 0
		yd   = (leap) ? 366: 365
		if(Day < yd)
			break
		++Year
		Day -= yd
	}
	for(Mon = 1; _MonLen[Mon+leap]+0 <= Day+0; ++Mon) {
		Day -= _MonLen[Mon+leap];
	}
	return sprintf("%.3s %.3s%3d %02d:%02d:%02d JST %d",
		_WeekName[Week], _MonName[Mon], Day,
		Hour, Min, Sec, Year)
}

{{comment multi|w}}