時刻書式

久々に趣味のプログラミング.

ファイルから文字列を読み込んで,それをデータ(数値)として扱うときに,日時とお金(3桁毎にカンマが打ってある書式)の処理が,単純にatoi()などを通すだけでは数値化できず面倒になる場面があります.この辺りの処理は,以前の日記で,標準C/C++ライブラリでもlocale辺りで実装されていると書きましたが,PCのロケールが不完全な場合があったりと(cygwinはその辺適当でした・・・),あまり使い勝手が良くありません.なので,少し作ってみました.

例えば,"2006/01/19 21:30:00"という日時の文字列を読み込んで,数値として扱いたい場合には以下のようなコードを書きます.

#include 
#include "clx/timefmt.h"

int main(int argc, char* argv[]) {
    // コンストラクタ時か実際に読み込む時に書式を設定
    clx::timefmt tfmt("%y/%m/%d %H:%M:%S");
    
    // 第1引数 = "2006/01/19 21:30:00" と仮定
    tfmt.assign(argv[1]);
    
    std::cout << tfmt.time().year << tfmt.time().mon
        << tfmt.time().day << tfmt.time().hour
        << tfmt.time().min << tfmt.time().sec << std::endl;

    return 0;
}

実行結果: 200611921300

時刻の表す書式はいろいろとありますが,このように最初に書式を渡すことで解析できるようになっています.書式は,printf()などのように"%"の後に指定し,指定可能な書式は以下の通り.

y : 年(yearメンバに格納する値)
m : 月(mon 〃)
d : 日(day 〃)
H : 時(hour 〃)
M : 分(min 〃)
S : 秒(sec 〃)
U : マイクロ秒(usec 〃)

基本的なものだけで曜日や月の英語名(Jan, Feb, ...)などは無理,"20051231"などのように間に区切り文字のようなものが入らない場合は解析不可能などまだ欠点も多いですが,それなりに使えそうなものになったかなぁと.

また,出力する際にも同じような方法で書式化して出力することができます.例えば,上に挙げた"2006/01/19 21:30:00"の数値を保持しているとして,

tfmt.str("%02dth %02m %y, %02H:%02M:%02S");

と指定すると,"19th 01 2006, 21:30:00"という文字列が取得できます.この辺りは,strftime()のサブセット的な位置付けなのでそちらを使った方が良いかもしれませんが.

関係ないですが,今までに書いたものもちょくちょくインターフェースが変わってる・・・一貫して同じインターフェースを使うのはなかなか難しい.