Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2017/08/24 (木)

なでしこ3で日付時間計算

| 22:04 | なでしこ3で日付時間計算 - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - なでしこ3で日付時間計算 - 雪乃☆雫のなでしこ日和 なでしこ3で日付時間計算 - 雪乃☆雫のなでしこ日和 のブックマークコメント

 なでしこ1にはあった、便利な日付時計算関数https://nadesi.com/doc/cmd-func.htm#k45)が、なでしこ3には無くなってしまいました。

 もしかしたら、後のバージョンアップで追々追加されていく予定なのかもしないけど、バイオリズムを作るに当たって、無いと不便なのでとりあえず作ってみた。

 だって、マイナビ連載9目の「オリンピックまであと何日?」(http://news.mynavi.jp/series/nadeshiko/009/)は、「日数差」の命令があれば、一行で出来る計算だったのに、わざわざUNIXTIMEを使った計算方法を解説されてるってコトは、たとえ追加されるとしても近日ってことは無いだろうからね。


 特に、「日付加算」と「時間加算」の命令は、書式がカンタンで便利な物でした。

 必要なのは、日付加算だけでしたが、時間加算の方がカンタンそうだったので、っちを先に作りました。

 日付加算は、UNIXTIMEを足していく方式だと、閏年の計算を入れなきゃならないのが何気に面倒そうだったので、年と月は単純に足してから合成することにしました。

 たぶん、なでしこ1と同様に動いていると思うんだけど・・・

日付加算時間加算
#-----------------------------------------------------------
●日付加算(SにAを)
  記号=Aの1だけ文字左部分。
  A=Aの1から1だけ文字削除。
  A=Aを「/」で区切る。
  y=A@1/12を切捨。m=A@1%12。
  S=Sを「/」で区切る。
  もし、記号=「+」ならば、
    y=y+(S@1+m)/12を切捨。
    S@0=S@0+A@0+y。
    S@1=(S@1+m)%12。
  違えば、
    S@0=S@0-A@0-y。
    S@1=S@1-m。
  ここまで。
  d=(A@2)*(24*60*60)。
  年=S@0。月=S@1。日=S@2。
  S=「{年}/{月}/{日}」をUNIXTIME変換。
  もし、記号=「+」ならば、S=S+d。
  違えば、S=S-d。
  S=Sを日時変換。
  S=Sの10だけ文字左部分。
  Sで戻るここまで。

●時間加算(SにAを)
  記号=Aの1だけ文字左部分。
  A=Aの1から1だけ文字削除。
  A=Aを「:」で区切る。
  時=(A@0)*24。分=(A@1)*60。秒=(A@2)。
  S=「{今日} {S}」をUNIXTIME変換。
  もし、記号=「+」ならば、S=S+時+分+秒。
  違えば、S=S-時-分-秒。
  S=Sを日時変換。
  S=Sの8だけ文字右部分。
  Sで戻るここまで。
#-----------------------------------------------------------
#以下はテスト
「2017/01/01」に「+0/1/0」を日付加算して表示。 #2017/02/01
「2017/01/01」に「-0/1/0」を日付加算して表示。 #2016/12/01

「10:30:00」に「+00:30:00」を時間加算して表示。 #10:00:00
「10:30:00」に「-00:30:00」を時間加算して表示。 #11:00:00

 続いて、「日数差」です。

 切捨は出来るのに、切り上げが出来ないとはこれいかに(?_?) ←バージョン0.1.5で、できるようになりました!

 まあ、CEILが使えるからいいけど。

 して、のところは使う予定は無いけど、もののついでで「時間差」「分差」「秒差」と全部作ったw

 ところで、四捨五入の仕様が変わってる?!

 なでしこ1の四捨五入は、「0.5を四捨五入して言う」とすれば答えは1で、小数点以下四捨五入して整数にするヤツでしたが、なでしこ3では答えが0となり、「5を四捨五入して言う」の答えが、10になるんですよ。 ←バージョン0.1.5で、なでしこ1と同様になりました!

 命令の説明に「整数Aの一桁目を丸めて返す」とゆうことは、それであってるのかなー・・・??

 まあ、ROUNDあるからいいけど。

 して、色々とお試ししてみると、時間差分差の計算は、四捨五入ROUND)かと思いきや違うみたい。

 30分差や30秒差(0.5)の場合は0となり、31分差や31秒差の時は1とゆうことになってるみたいなんだよね。5捨6入・・・?

 これタブン、なでしこ1と同じ結果になってると思うんだけど・・・

日数差時間差分差秒差
#-----------------------------------------------------------
●日数差(AとBの|AからBまでの)
  A=AをUNIXTIME変換。B=BをUNIXTIME変換。
  結果=(B-A)/(24*60*60)。
  もし、結果>0ならば、結果を切捨で戻る。
  違えば、結果をCEIL戻る。 #なぜか「切り上げ」が出来ない…。まあ、CEILが使えるからいいけど。
ここまで。

●時間差(AとBの|AからBまでの)
  Aで「/」を文字検索。
  もしそれ=0ならば、A=「{今日} {A}」。
  Bで「/」を文字検索。
  もしそれ=0ならば、B=「{今日} {B}」
  A=AをUNIXTIME変換。B=BをUNIXTIME変換。
  結果=(B-A)/(60*60)
  もし、結果=0.5ならば、結果を切捨で戻る。
  違えば、結果をROUND戻るここまで。

●分差(AとBの|AからBまでの)
  Aで「/」を文字検索。
  もしそれ=0ならば、A=「{今日} {A}」。
  Bで「/」を文字検索。
  もしそれ=0ならば、B=「{今日} {B}」
  A=AをUNIXTIME変換。B=BをUNIXTIME変換。
  結果=(B-A)/60
  もし、結果=0.5ならば、結果を切捨で戻る。
  違えば、結果をROUND戻るここまで。

●秒差(AとBの|AからBまでの)
  Aで「/」を文字検索。
  もしそれ=0ならば、A=「{今日} {A}」。
  Bで「/」を文字検索。
  もしそれ=0ならば、B=「{今日} {B}」
  A=AをUNIXTIME変換。B=BをUNIXTIME変換。
  (B-A)で戻るここまで。
#-----------------------------------------------------------
#以下はテスト
来年今年+1 #なでしこ3では{}の中の変数は展開されるが{今年+1}のような書き方は出来ない今日と「{来年}/01/01」の日数差表示。 #元日まで何日か。
今日と「{今年}/01/01」の日数差表示。 #元日から何日か。

「00:00:00」と時間差表示。
「00:00:00」と分差表示。
「00:00:00」と秒差表示

 ・・・どうかなぁ?

通りすがり通りすがり2017/08/29 21:28ためしにpluginの形にしてみました。
wnako.jsもしくはeditor.jsxの後にscriptタグで読み込むと使えます。
(取り込み方はタートルグラフィクスのプラグインと同様)
でも、なんか動きは違うような気もするのですが、オフィシャルのpluginではないので気にしないことにしました。
下記のデモのトップにある簡易エディタではこのpluginを取り込んでいるので、命令がそのまま使えます。

でもとっぷ
weyk.la.coocan.jp/weyk/nadesiko3/demo/index.html

ぷらぐいん単体
weyk.la.coocan.jp/weyk/nadesiko3/release/plugin_weykdatetime.js

kujirahandkujirahand2017/08/30 07:49貴重な情報ありがとうございます。
次の版では、切り上げが使えない問題とか、四捨五入の問題とか直します。

雪乃☆雫雪乃☆雫2017/08/30 08:06 おおぉ、プラグイン!
 すごいです。さすがです☆
 あっ、しかし「日数差・時間差・分差・秒差」の結果の+と-が、真逆になっているのでございます。
 あああ、なんかスミマセン;
 それこそ、自分で-1を掛ければいいだけなのですが;;;

雪乃☆雫雪乃☆雫2017/08/30 08:17 kujirahandさま、コメントありがとうございます!!!
 なんか、一人でぼやきまくっていてスミマセンm(_ _)m
 どこに報告を上げたらいいのかもよく分からず・・・イヤ、それ以前に、問題なのか仕様なのか、それとも自分が間違っているのかすら、よく分からず・・・なのです;;;
 でも、とてもとても応援しています☆

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20170824