この初版はLua 5.0向けに書かれたものです。後のバージョンでも大部分は関連性がありますが、いくつかの違いがあります。
第4版はLua 5.3を対象としており、Amazonやその他の書店で入手できます。
この本を購入することで、Luaプロジェクトの支援にもなります。


22.1 – 日付と時刻

Luaでは、timedateという2つの関数が、すべての日付と時刻のクエリを行います。

引数なしで呼び出された場合、time関数は、現在の日付と時刻を数値としてコード化して返します。(ほとんどのシステムでは、この数値は、あるエポックからの秒数です。)テーブルとともに呼び出された場合、そのテーブルで記述された日付と時刻を表す数値を返します。このような日付テーブルには、次の重要なフィールドがあります。

year完全な年
month01-12
day01-31
hour00-23
min00-59
sec00-59
isdstサマータイムの場合、trueとなるブール値

最初の3つのフィールドは必須です。その他のフィールドは、指定されていない場合は正午 (12:00:00) にデフォルト設定されます。リオデジャネイロ(グリニッジの西3時間)で実行されているUnixシステム(エポックが1970年1月1日00:00:00 UTC)では、次の例があります。

    -- obs: 10800 = 3*60*60 (3 hours)
    print(os.time{year=1970, month=1, day=1, hour=0})
      --> 10800
    print(os.time{year=1970, month=1, day=1, hour=0, sec=1})
      --> 10801
    print(os.time{year=1970, month=1, day=1})
      --> 54000   (obs: 54000 = 10800 + 12*60*60)

date関数は、その名前にもかかわらず、time関数の逆のようなものです。日付と時刻を表す数値を、より高レベルの表現に変換します。その最初のパラメータは、必要な表現を記述するフォーマット文字列です。2番目は数値による日付と時刻で、デフォルトでは現在の日付と時刻です。

日付テーブルを生成するには、フォーマット文字列"*t"を使用します。たとえば、次のコード

    temp = os.date("*t", 906000490)
は、次のテーブルを生成します。
    {year = 1998, month = 9, day = 16, yday = 259, wday = 4,
     hour = 23, min = 48, sec = 10, isdst = false}
os.timeで使用されるフィールドに加えて、os.dateによって作成されたテーブルは、曜日(wday、1が日曜日)と年の日(yday、1が1月1日)も与えることに注意してください。

他のフォーマット文字列の場合、os.dateは日付を文字列としてフォーマットします。これは、フォーマット文字列のコピーであり、特定のタグが時刻と日付に関する情報に置き換えられたものです。すべてのタグは、次の例のように、`%`とそれに続く文字で表されます。

    print(os.date("today is %A, in %B"))
      --> today is Tuesday, in May
    print(os.date("%x", 906000490))
      --> 09/16/1998
すべての表現は、現在のロケールに従います。したがって、ブラジル・ポルトガル語のロケールでは、%B"setembro"となり、%x"16/09/98"になります。

次の表は、各タグ、その意味、および1998年9月16日(水曜日)の23:48:10の値を示しています。数値の場合、表には可能な値の範囲も示しています。

%a曜日の省略名(例:Wed
%A曜日の完全名(例:Wednesday
%b月の省略名(例:Sep
%B月の完全名(例:September
%c日付と時刻(例:09/16/98 23:48:10
%d月の日 (16) [01-31]
%H24時間制を使用した時間(23)[00-23]
%I12時間制を使用した時間(11)[01-12]
%M分 (48) [00-59]
%m月 (09) [01-12]
%p"am"または"pm"pm
%S秒 (10) [00-61]
%w曜日 (3) [0-6 = 日曜日-土曜日]
%x日付(例:09/16/98
%X時刻(例:23:48:10
%Y完全な年 (1998)
%y2桁の年 (98) [00-99]
%%文字 `%`

引数を指定せずにdateを呼び出すと、%cフォーマット、つまり、適切な形式での完全な日付と時刻情報が使用されます。%x%X、および%cの表現は、ロケールとシステムによって変化することに注意してください。mm/dd/yyyyのような固定表現が必要な場合は、"%m/%d/%Y"のような明示的なフォーマット文字列を使用してください。

os.clock関数は、プログラムのCPU時間の秒数を返します。典型的な使い方は、コードの一部をベンチマークすることです。

    local x = os.clock()
    local s = 0
    for i=1,100000 do s = s + i end
    print(string.format("elapsed time: %.2f\n", os.clock() - x))