2008年12月28日

日時加算

なでしこは便利なんですが、どうも時間計算が余り得意ではない印象です。

特にUNIX時間のようなシリアル時間への変換にネイティブでは対応していないのが致命的で日付を跨ぐ時間の足し引きはかなり面倒くさいのが実情です。

(まぁ、頑張れば出来ないことはないですが)

また、日付加算や時間加算命令はあるのですが、時間加算命令は時間しか考慮してくれない困りもののため日付を跨ぐような加減算はそのままでは出来ません。

で、それを何とかしてみるために関数を一つ拵えてみました。

●日時加算(S_DATETIMEにP_DATETIMEを)
 S_DATEはS_DATETIMEを「yyyy/mm/dd」に日時形式変換
 S_TIMEはS_DATETIMEを「hh:nn:ss」に日時形式変換
 S_NUMはS_TIMEを「hhnnss」に日時形式変換を整数変換
 P_FLAGはP_DATETIMEをトリムから1文字左部分
 もし、P_FLAGが「+」またはP_FLAGが「-」ならば
  P_DATETIMEの1から1文字削除
 違えば
  P_FLAGは「+」
 P_ARRとは配列
 P_ARRはP_DATETIMEを「 」で区切る
 もし、P_ARR[0]で1から「:」を文字検索ならば、
  P_DATEは「0/0/0」
 違えば、
  P_DATEはP_ARRの0を配列切り取る
 P_TIMEはP_ARRの0を配列切り取る
 P_TARRとは配列
 P_TARRはP_TIMEを「:」で区切る
 R_CARRYは(P_TARR[0]/24)の整数部分
 もし、P_FLAGが「+」ならば、
  R_TIMEはS_TIMEにP_TIMEを時間加算
  R_NUMはR_TIMEを「hhnnss」に日時形式変換を整数変換
  もし、R_NUMからS_NUMを引くが0未満ならば、
   R_CARRYに1を直接足す
  R_DATEはS_DATEにP_DATEを日付加算
  R_DATEはR_DATEに「0/0/{R_CARRY}」を日付加算
 違えば、
  R_TIMEはS_TIMEに「-{P_TIME}」を時間加算
  R_NUMはR_TIMEを「hhnnss」に日時形式変換を整数変換
  もし、S_NUMからR_NUMを引くが0未満ならば、
   R_CARRYに1を直接足す
  R_DATEはS_DATEに「-{P_DATE}」を日付加算
  R_DATEはR_DATEに「-0/0/{R_CARRY}」を日付加算
 「{R_DATE} {R_TIME}」で戻る
使い方は以下のような感じです。
#結果は「2008/07/27 10:00:00」
「2008/12/28 12:00」に「-0/5/1 02:00」を日時加算を言う

#結果は「2008/12/29 01:00:00」
「2008/12/28 12:00」に「13:00」を日時加算を言う

#結果は「2008/12/26 12:00:00」
「2008/12/28 12:00」に「-48:00」を日時加算を言う
こんな感じで使えます。

なお、加算する値のプラス記号や年月日は省略可能です。

ただし、エラーチェックはほとんどやっていないので無茶な使い方をするとすぐにエラー出ます(^^;
なので、ユーザが入力した時間は必ず事前にチェックしてからこの関数に値を渡すようにしてください。

(と言うか、このぐらいの関数、ネイティブで取り込まれてくれると助かるなぁ・・・)

Posted by Takuchan at 2008年12月28日 05:04 | トラックバック(0)

ありがとうございます!

ちょいと日時加算をしたい場合があって、
役に立ちました。

Posted by: catch at 2009年05月07日 00:44