Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2017-08-24

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

| 22:04

 なでしこ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)*60*60。分=(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

2017-08-19

バイオリズム

| 21:18

 突然何の脈絡も無く、バイオリズムを表示するプログラム。

 ムカシはだいぶ流行ったけど、最近はあんまりお見かけしませんね。

 やっぱり、カガク的コンキョに欠けるとゆうコトなんでしょうか。

 のわりには、血液型占いは廃れないよね~。

 A型が几帳面だなんて、絶っっ対にあり得ないと思うんだけど・・・(^▽^;

#バイオリズム(なでしこ1)

#-----宣言--------------------------------------------------
生年月日とは文字列。生年月日=「」。
当日とは整数。当日=今日の2文字右部分整数変換。
当月とは整数。当月=今日の6から2文字抜き出しを整数変換。
基準日とは整数。基準日=今日に「-0/0/{当日-1}」を日付加算。
誕生日とは文字列表示年とは整数表示月とは整数表示年月とは文字列。
閏年とは整数。
月末とは整数。
#-----------------------------------------------------------
母艦について
  クライアント幅は640。クライアント高さは480。

文字色黒色。30,20へ「生年月日(yyyy/mm/dd):」を文字描画。
生年月日エディタとはエディタこれについて
  位置は「175,15」。幅は80。テキストは生年月日。
部品間隔は0。
前月ボタンとはボタンこれについて
  位置は「280,15」。幅は50。高さは20。
  クリックした時は~
    基準日=基準日に「-0/1/0」を日付加算。
    バイオリズム表示今月ボタンとはボタンこれについて
  位置は前月ボタンの右側。幅は50。高さは20。
  クリックした時は~
    基準日=今日に「-0/0/{当日-1}」を日付加算。
    バイオリズム表示。
翌月ボタンとはボタンこれについて
  位置は今月ボタンの右側。幅は50。高さは20。
  クリックした時は~
    基準日=基準日に「+0/1/0」を日付加算。
    バイオリズム表示文字色青色。480,20へ「■身体」を文字描画文字色赤色。530,20へ「■感情」を文字描画文字色緑色。580,20へ「■知性」を文字描画。
#-----------------------------------------------------------
枠描画。
もし、生年月日がならば、「生年月日を入力して下さい」と言う違えば、バイオリズム表示。
#-----------------------------------------------------------

*枠描画
 線スタイルは実塗りスタイルはべた。線色白色塗り色白色文字色黒色。
 0,40から640,480へ四角。
 11
  もし、((回数-1)=0)ならば、3,40へ「高{~}調{~}期」を文字描画。
  もし、((回数-1)=9)ならば、3,((回数-1)*40+40)へ「低{~}調{~}期」を文字描画。
  もし、((回数-1)=5)ならば、
    3,((回数-1)*40+20)へ「要{~}{~}意」を文字描画。
    線スタイルは透明。塗りスタイルはべた。塗り色黄色。
    20,((回数-1)*40+20)から620,((回数-1)*40+60)へ四角。
  線色黒色塗りスタイルは透明。
  もし、((回数-1)=0)または((回数-1)=5)または((回数-1)=10)ならば、
    線太さは2。線スタイルは実。
  違えば、
    線太さは1。線スタイルは点。
  20,((回数-1)*40+40)から620,((回数-1)*40+40)へ。

 31
  もし、((回数-1)=0)または((回数-1)=30)ならば、
    線太さは2。線スタイルは実。
  違えば、
    線太さは1。線スタイルは点。
  ((回数-1)*20+20),40から((回数-1)*20+20),440へ。

 (月末)
  ((回数-1)*20+15),450へ回数文字描画。
#-----------------------------------------------------------

*バイオリズム表示
  生年月日は生年月日エディタのテキスト。
  誕生日=「{生年月日の4文字左部分}年{生年月日の6から2文字抜き出し}月{生年月日の2文字右部分}日」
  表示年=基準日の4文字左部分整数変換。
  表示月=基準日の6から2文字抜き出しを整数変換。
  表示年月=「{表示年}年{表示月}月」

  もし表示年%4=0でなければ、閏年=いいえ。
  違えばもし表示年%100=0でなければ、閏年=はい。
  違えばもし表示年%400=0でなければ、閏年=いいえ。
  違えば、閏年=はい。
  もし、(表示月=02)または(表示月=04)または(表示月=06)または(表示月=09)または(表示月=11)でなければ、月末=31。
  違えばもし表示月=02ならば、
    もし、閏年=はいならば、月末=29。
    違えば、月末=28。
  違えば、月末=30。

  母艦のタイトルは「{誕生日} 生まれの方の {表示年月} のバイオリズム」
  枠描画。バイオリズム描画。

*バイオリズム描画
 線太さは3。線スタイルは実塗りスタイルはベタ。
 31
  日付=基準日に「+0/0/{回数-1}」を日付加算。
  結果=生年月日と日付でバイオリズム計算。
  身体2=(結果¥0)*2。
  感情2=(結果¥1)*2。
  知性2=(結果¥2)*2。
  もし回数>1ならば、
    線色青色。(20*(回数-1)),(-身体1+240)から(20*回数),(-身体2+240)へ
    線色赤色。(20*(回数-1)),(-感情1+240)から(20*回数),(-感情2+240)へ
    線色緑色。(20*(回数-1)),(-知性1+240)から(20*回数),(-知性2+240)へ
  もし、(表示年=今年)かつ(表示月=今月)かつ(回数=当日)ならば、
    線色青色塗り色青色。(20*回数-5),(-身体2+240-5)から(20*回数+5),(-身体2+240+5)へ
    線色赤色塗り色赤色。(20*回数-5),(-感情2+240-5)から(20*回数+5),(-感情2+240+5)へ
    線色緑色塗り色緑色。(20*回数-5),(-知性2+240-5)から(20*回数+5),(-知性2+240+5)へ
  身体1=身体2。
  感情1=感情2。
  知性1=知性2。
#-----------------------------------------------------------
#外枠の表示
 線色黒色塗りスタイルは透明。
 18,38から622,442へ四角。
#-----------------------------------------------------------
*バイオリズム計算(誕生日と基準日で)
  日数=誕生日と基準日の日数差。
  結果¥0=SIN(日数/23*PI*2)*100を整数変換。
  結果¥1=SIN(日数/28*PI*2)*100を整数変換。
  結果¥2=SIN(日数/33*PI*2)*100を整数変換。
  結果で戻る。
#-----------------------------------------------------------

 生年月日を入力して「今月」のボタンを押せば表示されます。

 宣言のところで、生年月日に自分のを入れとけば、それが自動的に表示されます。

 高調期や低調期は、それほど気にする必要は無く、0と交わる辺りが注意日で色々と不安定になるので気をつけなければならないそうです。


 こんなヤツを、なでしこ3で、ウェブ上に設置できたら面白そうだなぁ~と思って、なでしこ1で試しに作ってみたんだけど・・・

 まあ、バイオリズム自体は、サインカーブを描くだけなんで、サインもコサインも何も覚えてないけど、プログラム的にはそう難しいことはないんですが、なでしこ3では使えない命令があったり、色々ナゾ現象はあるし、密かに違っているところも多くて、なんだか次から次へとエラーが出る~(*_*;

 たとえば、文字列中の{}の中の変数は、1同様展開されるんだけど、の中で{回数-1}みたいに計算するコトは出来ないみたいなんだよね。不便っす;;;

 でも、それ以前にずっと引っかかっていたのは、<button>タグのonclickに、なでしこの関数を設定したりは出来ないのかしらん・・・とゆうことでした。

 カナリ色々試したんだけど、のところムリっぽい気が~・・・・・・(?)

 ↑バージョン0.1.5でできるようになりました!!!


◆覚え書き◆

※バイオリズムの計算式
日数差=誕生日-基準日。
身体のリズム=23。
感情のリズム=28。
知性のリズム=33。
SIN日数差/リズム*PI*2)

※閏年の計算方法
1、4で割り切れる。
2、ただし、100で割り切れる場合は閏年でない。
3、ただし、400で割り切れる場合は閏年である
トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20170819