SimpleDateFormatのパースは前方一致だよ

SimpleDateFormat#parse(String, ParsePosition)のコード読んだら,そうだった。だから,

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
sdf.setLenient(false);
Date date = sdf.parse(source);

なコードの場合,次の文字列は日付としてパスする。

2007/01/12
2007/1/1
07/01/12
2007/1/31(WED)
2007/2/6に買い物に行きました。

SimpleDateFormat#setLenient(false)は,暦通りの日付かどうかのチェックしかしないようだ。:-(
なんで,setLenient(false)の場合,"2007/2/29"は不正な日付だけど,trueだと"2007年3月1日"と解釈される。
...というのは知ってたんだけど,表題のことは知らなかった。まだまだ,修行が足りない。orz


日付の検査にSimpleDateFormatだけを利用してると,こんなところで足下をすくわれるので,併せて文字列検査(「数字と/だけ」とか)を組み合わせとく必要があるのだろう。
#自前でDateFormatを実装するのは,ちょっとイヤだ。


などと今更言ってみるテスト。:-)


(追記)コメントありがとうございます。なるほどと思い試してみました。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
sdf.setLenient(false);
ParsePosition position = new ParsePosition(0);
Date date = sdf.parse(source, position);
if (position.getErrorIndex() != -1) {
  // パース失敗
} else {
  // パース成功
  if (position.getIndex() != source.length()) {
    // 厳密には失敗
  }
}

うむ,評価精度を高めたいならこっちが正解だな。

Swing GUIプログラミング

ちょいと思うところあって,IDEAでSwingなぞを使ってみた。
NetBeansのMatisseを知っていると,さすがにGUIレイアウトの操作性は見劣りする。つうか,Matisseがスゴ過ぎるのダ。


あと,こんな起動コードを組むのは,ちょっとイヤ(良く忘れるんで自分メモ)。

public static void main(String[] args) throws Exception {
  UIManager.setLookAndFeel(new WindowsLookAndFeel());
  JFrame frame = new JFrame("sample");
  frame.setContentPane(new TestForm().panel1);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.pack();
  frame.setBounds(10, 10, 300, 200);
  frame.setVisible(true);
}

NetBeansの場合,起動部分も自動生成されるので気にする必要がないのが良い。


でも,IDEA好きだからIDEAで頑張る。:-D
#IDEA7あたりでGroupLayout対応して欲しいな...


ps.
Swing出た当時は「Metalかっこいい」と思っていたけど,今となっては正視に耐えないなぁ。

eneloop

ずっと前から欲しかったんだけど,なかなか手を出さずにいたeneloop
マウスの電池が切れと,amazonのギフト券が届いたタイミングが丁度あったので,遂に購入.
ちょっと奮発して急速充電器にしたのはいいが,果たして元を取るのにどんだけかかるんだろう...

SANYO eneloop 急速充電器セット N-M58TGS

SANYO eneloop 急速充電器セット N-M58TGS