CANPAN ブログ検索
Loading
  • もっと見る
<< 2019年09月 >>
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          
カテゴリアーカイブ
最新記事
最新コメント
死亡日を「和暦」と「西暦」で表示する [2016年10月15日(Sat)]
死亡日を「和暦」と「西暦」で表示する



 故人の死亡日から、法事の予定(1周忌、3回忌、7回忌、13回忌など)を管理することにしました。


 そこで問題になったのは、「西暦」から「和暦」に変換することでした。


 「1989年は全て平成元年とする」というような年単位の和暦変換は簡単にできますが、日付単位での和暦変換を目指すことにしました。


 ちなみに、日本語Linuxの「Fedora24」上で「Apache/2.4.23 (Fedora) OpenSSL/1.0.2j-fips PHP/5.6.26 mod_perl/2.0.9 Perl/v5.22.2」を使用しています。



データベースの日付

Aさんの死亡日(1989-01-07)

Bさんの死亡日(1989-01-08)


処理後

Aさん 昭和 64 年 01 月 07 日 1989-01-07

Bさん 平成 元 年 01 月 08 日 1989-01-08


 ネットを検索していて、偶然、「負のタイムスタンプをサポート」できることを知りました。


*****引用開始*****

strtotime


注意:

 年を 2 桁の数値で指定した場合、その値が 00-69 なら 2000-2069 に、 70-99 なら 1970-1999 にそれぞれ変換されます。 32 ビットシステム上での相違点 (2038-01-19 03:14:07 までの日付しか表せない) については以下の注意を参照ください。


注意:

 タイムスタンプの有効な範囲は、通常、Fri, 13 Dec 1901 20:45:54 UTC から Tue, 19 Jan 2038 03:14:07 UTC までです (これらは、32 ビット符号付整数の最大及び最小に一致します)。


 全てのプラットフォームが負のタイムスタンプをサポートしている わけではありませんので、PHP 5.1.0 より前のバージョンでは、日付の範囲が Unix エポック以前にはならないかも知れません。 これは、例えば Windows やいくつかの Linux ディストリビューション、 いくつかの他のオペレーティングシステムでは 1970 年 1 月 1 日以前の日付では動作しない事を意味しています。


 64 ビット版の PHP では、タイムスタンプの有効範囲は事実上無制限です。というのも、64 ビットでは過去側も未来側も約 2930 億年を表せるからです。

*****引用終わり*****


*****引用開始*****

PHPで和暦・日本語曜日を使う


['name' => '平成', 'name_short' => 'H', 'timestamp' => 600188400], // 1989-01-08,

['name' => '昭和', 'name_short' => 'S', 'timestamp' => -1357635600], // 1926-12-25'

['name' => '大正', 'name_short' => 'T', 'timestamp' => -1812186000], // 1912-07-30

['name' => '明治', 'name_short' => 'M', 'timestamp' => -3216790800], // 1868-01-25

注意

 明治5年以前は天保暦・寛政暦などが利用されており、現在のグレゴリオ暦と日付が一致していません。

*****引用終わり*****



 次のようにすることにしました。


 wikiによると、日本でのグレゴリオ暦導入年月日は、「1873年(明治6年)1月1日」となっていますので、1873年1月1日以降に限り、日付単位での和暦変換をすることにしました。


 「1873-01-01」の「timestamp」は、「-3061011600」です。



データベースの日付

Cさんの死亡日(1872-12-31)

Dさんの死亡日(1873-01-01)


処理後

Cさん グレゴリオ暦導入より前 1872-12-31

Dさん 明治 6 年 01 月 01 日 1873-01-01



 参考として、このプログラムの応用として、会社の歴代社長の在任期間(治世?)を表示することにより、ある案件を何代目の社長が決済したかわかるようになります。


 韓国の歴史ドラマを見て思いついたのですが、君主名に即位からの年数を添えるもの (在位紀年) で表しています。


*****引用開始*****

朝鮮王朝実録


1413年(太宗13年)に太祖実録15巻を編纂したのを始め、歴代国王の実録を編修し、

*****引用終わり*****


 トヨタ自動車の歴代社長を例にすると、社長に就任した日付を Unix タイムスタンプに変換して、プログラムを少し修正すれば下のように年月日を表示することができます。

Eの決済年月日 第10代渡辺捷昭 5 年 06 月 22 日 2009-06-22

Fの決済年月日 第11代豊田章男 元 年 06 月 23 日 2009-06-23


※当然、「部長」や「課長」などの在任期間でも表示できます。




 それでは、プログラムを紹介します。


1 「houji」というデータベースを作成します。


CREATE TABLE houji (

id_no SERIAL PRIMARY KEY,

namae text,

tudukigara text,

nenngappi date,

nennrei int4

);



namae text, 故人 例「安倍晋太郎」

tudukigara text, 続柄 例「寛信 父」

nenngappi date, 没年月日 例「1991-05-15」

nennrei int4 没満年齢 例「67」


2 「index.php」というプログラムを作成します。


 プログラムの一部のみを載せます。


 事前に、データベースの総件数を取得し、「$zenbu」に入力します。


 「for ループ」を使用し、「$i」の数値を一つづつ増加することで、処理したデータを表示します。


<?php
// エラー出力する場合

ini_set( 'display_errors', 1 );


// データの取り出し

$sql = "select *

from houji

order by nenngappi

";

$result = pg_query($sql);


// 繰り返し開始

for ($i = 0;$i < $zenbu;$i++) {

// 死亡日(和暦)

// データベースから死亡日付を取り出す

$str = pg_fetch_result($result,$i,3);

// 同じ死亡日付を、西暦でも使用する

$seireki = $str;


// 死亡日付を「年」(4桁の数字)、「月」(2桁の数字)、「日」(2桁の数字)に分ける

$str_y = substr( $str, 0, 4 );

$str_m = substr( $str, 5, 2 );

$str_d = substr( $str, 8, 2 );


// 英文形式の死亡日付を Unix タイムスタンプに変換する

$wareki = strtotime($str);


// タイムスタンプを使って、死亡日付を時代で分ける

if ($wareki < -3061011600) {

// 日本でのグレゴリオ暦導入年月日「1873年(明治6年)1月1日」の前なので、採用しない

$gengo = "江戸時代(グレゴリオ暦導入より前)";


} elseif ($wareki < -1812186000) {

// 明治時代(明治6年1月1日以降)

$str_y = $str_y - 1868 + 1;

$gengo = "明治 $str_y 年 $str_m 月 $str_d 日 ";


} elseif ($wareki < -1357635600) {

// 大正時代

$str_y = $str_y - 1912 + 1;

if ($str_y == 1) {

$str_y = "元";

}

$gengo = "大正 $str_y 年 $str_m 月 $str_d 日 ";


} elseif ($wareki < 600188400) {

// 昭和時代

$str_y = $str_y - 1926 + 1;

if ($str_y == 1) {

$str_y = "元";

}

$gengo = "昭和 $str_y 年 $str_m 月 $str_d 日 ";


} else {

// 平成時代

$str_y = $str_y - 1989 + 1;

if ($str_y == 1) {

$str_y = "元";

}

$gengo = "平成 $str_y 年 $str_m 月 $str_d 日 ";

}

print("$gengo");


// 死亡日(西暦)

print("$seireki");


print("\n");

// 繰り返し終了


}
?>


Posted by 山田 雄一郎 at 11:59
この記事のURL
http://blog.canpan.info/hofu_nanboku/archive/336
プロフィール

山田 雄一郎さんの画像
山田 雄一郎
プロフィール
ブログ
リンク集
http://blog.canpan.info/hofu_nanboku/index1_0.rdf
http://blog.canpan.info/hofu_nanboku/index2_0.xml