元号

緊張した面持ちの小渕さんが掲げた「平成」のシーンが記憶に残る唯一の改元なわけだが、そろそろその平成も終わりに近づき。
次は何だとか、平成継続とかいろいろ話はあるのだが、プログラム的に元号が必要な場面は、公的な文書や銀行関係への文書とかに限定される。他にも使っているところはあるだろうが、今回を機に西暦表記へ変更するところも少なくないだろう。
まぁそれでも元号表記は残るわけで。

古くからのプログラムの中には独自のテーブルを作って元号を取得するものも少なくない。
和暦テーブルとして一般的なのは、その元号の開始日(西暦)と元号で足りる。
1989/01/08,平成
みたいな感じで、過去のものも必要なら並べて、対応する元号を探して表示、てなことをする。
これのメリットは「好きなようにできる」ことであり、OS/LibraryがUpdateできなくても定義に追加すれば取得できる。

とぉ言われていたりもするわけだが、OS/LibraryだってUpdateしなくても定義変えればいけちゃうので、自前テーブル作る意味は殆ど無い。全くないとは言わない。「年度計算」が残るわけだし。

で本題。
単純に和暦が欲しい場合、gccならばstrftimeに任せる。
strftimeではいろいろ特殊な書式があって、和暦の場合は%Eを使う。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <locale.h>

int main(void) {
time_t t = time(NULL);
char buf[128];
char *curlocale = setlocale(LC_TIME, NULL); //現在localeを取得
if (setlocale(LC_TIME, "ja_JP.utf8") != NULL) {
strftime(buf, sizeof buf, "%EC%Ey年%m月%d日", localtime(&t));
puts(buf)l;
setlocale(LC_TIME, curlocale); //localeを元に戻す
}

return 0;
}

これで簡単に和暦が取れちゃうわけなので、ごちゃごちゃやらずにstrftime使いましょう。
改元があっても、glibcがUpdateされればそのまま使えるけれど、業務用システムでUpdateなんてとんでもない、のような場合は、localedefで独自定義作っちゃえば良し。

Windowsの場合、今環境がなくて確認できないけれど、cliならばDateTimeの書式に%ggが使えたような。OleDateTimeでも。strftimeでももしかしたら使えるのかもしれない。
で、こいつは時刻の設定とか地域の設定とかで定義されるロケールを使用するはずなので、改元があってUpdateできない環境であってもレジストリいぢればいける。
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Nls/Calendars/Japanese/Era
あたりにそれっぽく入っているような。
それっぽく追加してやればそれっぽく動くんじゃないかな。
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

f_yamaki

Author:f_yamaki

アクセスカウンタ
最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブロとも申請フォーム

この人とブロともになる

ブログ内検索
RSSフィード
リンク