インサイダー取引になってしまいます
インサイダー取引になってしまいます
株式についてはさっぱり知識がありませんが、かなりドキッとする言葉でした。詳しい話を聞くとその会社では、前もって「株式売買申請書」というWeb申請を出さないと、自社株を売却できないルールになっているそうです。そこで現在は、「売却希望日」に「過去日付」を入力してWeb申請できてしまうから、システムでチェックを入れてほしいという要望でした。
JavaScriptでチェックする
それなら、サーバー側にPOSTする前に、クライアント側でJavaScriptを使ってチェックすればいいですね。
1 |
<script type="text/javascript"> |
ところがです。なぜか「申請日当日の売買希望日」がエラーになってしまいます。「申請日より過去日付のみエラーにする」という実装でOKだったのですが、どうやらうまく動いていません。なぜ22行目に処理が入ってくるのか、机上デバッグでは分かりませんでした。
時刻はいらない
そうです。今回の現象は、日付型には時刻が入っていることを忘れた為に、発生していました。具体的には、変数buydateには「2009/09/09 00:00:00」が、変数todayには「2009/09/09 14:17:50」が入っていました。なるほど~。確かに「buydate < today」なので、当日もエラーで判定されることには納得できました。
現在日付で00:00:00
理由が分かったところで修正方法を考えてみると、時刻の部分で不等式が狂っているのだから、時刻がなくなればいい。つまり「現在日付で00:00:00」が取得できればOKということになります。
まずは、ググってみました。同じことを過去にやった人がいるはずです。すると、さまざまな実装方法が見つかったのですが、だいたい4パターンで書かれていることに気がつきました。それがさらに大きく2つの派閥に分かれます。
1行で書くよ派
(1)newで頑張る
1 |
// newで頑張る |
かなり頑張ってます。こんなに同じオブジェクトを繰り返しnewしなければならないなら、一度変数に格納したいところです。作者の「1行への執念」を感じました。
(2)年月日の部分を文字列にして短く
1 |
// 年月日の部分を文字列にして短く |
こちらは、とてもシンプルです。文字数も少なく、ぱっと全体を把握できる点がいい感じです。
2行で書くよ派
(3)きっちり個別指定
1 |
// きっちり個別指定 |
これは、最初に出てきた(1)の変数使用バージョンです。一番件数が多かったです。ちなみにDateのコンストラクタ内では、getMonth()に「+1」する必要はありません。getMonth()は「0~11」を返すので、文字列にして表示する場合は「+1」する必要があるのですが、そのパターンをまねて「+1」してしまい間違っている例がありました。
(4)後で時間を0にする
1 |
// 後で時間を0にする |
分かりやすい。頭の中で考えたフローをそのままコードに落としたような実装です。後から誰が読んでも理解できる点が好印象です。
で、結局どれだい?
結局(2)を採用しました。(※実際は以下のように単純なHTMLではなく、もっと複雑なASPXファイルで実装されています。)
1 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
かなりの接戦でした。(4)も(2)と同様にシンプルであり、とても難しい決断でした。しかし今回は、(4)はあまりにも普通であり、(2)ほど感動させたとまでは言い切れないため、最後的には(2)がグランプリに相応しいと判断しました。
準グランプリの(4)も評価されるべき存在です。もしもわたしが新人研修の講師役だったら、無難に(4)で書いておけと言うでしょう。それほどの接戦でした。
最後に
このコラムでは、「XML」を切り口にしていろいろ書いているのですが、今回はとうとう「XML」が一度も出てこないんじゃないかという勢いでした。しかし、最後の最後に「XHTML」という反則技を使って「XML」を無理やり登場させました。何とか帳尻合わせができたでしょうか?