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](https://images-fe.ssl-images-amazon.com/images/I/415XFWQ7E2L._SL160_.jpg)
SANYO eneloop 急速充電器セット N-M58TGS
- 出版社/メーカー: 三洋電機
- 発売日: 2006/12/01
- メディア: エレクトロニクス
- 購入: 5人 クリック: 24回
- この商品を含むブログ (20件) を見る