質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

9996閲覧

日付が正しいかどうかの確認方法を教えてください。

lena

総合スコア31

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2016/03/06 11:52

JAVA初心者です。
下記のような担当者別月額売上表を作成したいのですが、日付が正しいものまで
falseで返ってきてしまいます。
メソッドの使い方が間違っているのでしょうか?
解決方法を教えてください、よろしくお願いします。

【完成例】
担当者,売上日,商品名,数量,売上金額,備考
山田,20160227,チョコレート,3,300
山田,20160228,マシュマロ,1,200
山田,20160229,クッキー,1,300
山田,20160230,せんべい,2,400,日付に誤り有
201602月合計,,,,,1200

【現時点】
担当者,売上日,商品名,数量,売上金額,備考
山田,20160227,チョコレート,3,300 ,日付に誤り有
山田,20160228,マシュマロ,1,200,日付に誤り有
山田,20160229,クッキー,1,300,日付に誤り有
山田,20160230,せんべい,2,400,日付に誤り有
201602月合計,,,,,1200

package test4; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.text.DateFormat; import java.util.HashMap; public class StaffMonthlySalesRecord { public static void main(String[] args) { BufferedReader brInputFileA= null ; //商品マスタ用 BufferedReader brInputFileM= null ; //売上明細用 BufferedWriter bwOutputFileA = null ; //月額売上表用 String stBufferM = ""; //inMファイルデータを格納 String stBufferA = ""; //inAファイルデータを格納 HashMap<String,HashMap<String,Object>> alDataM = new HashMap<String,HashMap<String,Object>>() ; //商品マスタの入力データを格納 HashMap<String, Object> mpDataM = null; String date = ""; //売上明細ファイルの購入月をセット String staff = ""; //売上明細ファイルの担当者をセット boolean isFirst = true; //0番目の売上日をセットする為の変数 boolean isFirstStaff = true; //0番目の担当者をセットする為の変数 int sum = 0; //合計金額 int allSum = 0; //月の合計金額 int cnt10 = 0; //10件を数えるカウンター final String noItem = "商品マスタ未存在"; final String nocalendar = "日付に誤りがあります"; try{ fileError:{ try{ brInputFileM = new BufferedReader(new InputStreamReader(new FileInputStream("C:/Users/temp/Desktop/inM.csv"),"JISAutoDetect")); }catch(FileNotFoundException e){ System.err.println("inMファイルが見つかりません。"); break fileError; } //inMファイルデータを読み込み while((stBufferM = brInputFileM.readLine()) != null){ if(stBufferM.equals("")){ System.err.println("データに不備があります。"); break fileError; } String[] itemM = stBufferM.split(","); mpDataM = new HashMap<String,Object>(); //商品マスタ用データを分割し格納 mpDataM.put("code",itemM[0]); mpDataM.put("name",itemM[1]); mpDataM.put("price",itemM[2]); alDataM.put(itemM[0],mpDataM); }//while try{ brInputFileA = new BufferedReader(new InputStreamReader(new FileInputStream("C:/Users/temp/Desktop/inA.csv"),"JISAutoDetect")); }catch(FileNotFoundException e){ System.err.println("inA.csvファイルが見つかりません。"); break fileError; } try{ bwOutputFileA = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:/Users/temp/Desktop/outA.csv"),"SJIS")); }catch(FileNotFoundException e){ System.err.println("outA.csvファイルが見つかりません。"); break fileError; } try{ bwOutputFileA.write("担当者" + "," + "売上日" + "," + "商品名" + "," + "数量" + " ," + "売上金額" + "," + "備考"); //項目名出力 bwOutputFileA.newLine(); while((stBufferA = brInputFileA.readLine()) != null){ if(stBufferA.equals("")){ System.err.println("データに不備があります。"); break fileError; } if(stBufferA.isEmpty()){ System.err.println("inA.csvファイルは空です。"); break fileError; } String[] itemA = stBufferA.split(","); mpDataM = alDataM.get(itemA[2]); if(stBufferA.equals("")){ System.err.println("データに不備があります。"); break fileError; } if(isFirstStaff){ staff = itemA[0]; isFirstStaff = false; } if(!alDataM.containsKey(itemA[0])){ staff = itemA[0]; isFirstStaff = false; } if(isFirst){ date = itemA[1].substring(0, 6); isFirst = false; } String boughtDay = (itemA[1].substring(0, 6)); int t = boughtDay.compareTo(date); //月変更の比較 if(t > 0){ bwOutputFileA.write("*"); bwOutputFileA.newLine(); bwOutputFileA.write(date.substring(0, 6) + "月合計" + "," + "," + "," + "," + allSum); //合計金額を出力 bwOutputFileA.newLine(); String a = " "; bwOutputFileA.write(a); bwOutputFileA.newLine(); date = itemA[0]; allSum = 0; // 月の合計を0に戻す } cnt10 = cnt10 + 1; //件数カウンターに1を加算 if(cnt10 >= 10){ //件数カウンターが10件に到達した場合 String a = " "; bwOutputFileA.write(a); bwOutputFileA.newLine(); cnt10 = 0; // 件数カウンターリセット } if(alDataM.containsKey(itemA[2])){ //商品コードが一致しているか確認 String a = itemA[0]; //担当者 String b = itemA[1]; //売上日 Object c = mpDataM.get("name"); //商品名 String d = itemA[3]; //数量 String e = ""; //備考 if(checkDate(itemA[1])){ //日付の妥当性を確認 int num = Integer.parseInt(itemA[2]); int num2 = Integer.parseInt((String) d); sum = num * num2; //数量×単価=金額 allSum = sum + allSum; //月合計を算出 bwOutputFileA.write(a + "," + b + "," + c + "," + d + "," + sum + "," + e); bwOutputFileA.newLine(); }else{ e = nocalendar; //備考=日付に誤りがあります bwOutputFileA.write(a + "," + b + "," + c + "," + d + "," + sum + "," + e); bwOutputFileA.newLine(); } }else{ String a = itemA[0]; //担当者 String b = itemA[1]; //売上日 String c = noItem; //商品名=商品マスタ未存在 String d = itemA[2]; //数量 bwOutputFileA.write(a + "," + b + "," + c + "," + d); bwOutputFileA.newLine(); } }//while bwOutputFileA.write("*"); bwOutputFileA.newLine(); //bwOutputFileA.write(date.substring(0, 6) + "月合計" + "," + "," + "," + "," + allSum); //合計金額を出力 }//try catch(IOException e){ System.err.println("エラーが発生しました。"); e.printStackTrace(); } }//fileError } //try catch(IOException e){ System.err.println("エラーが発生しました。"); e.printStackTrace(); } finally{ try { if(brInputFileA != null){ brInputFileA.close(); } if(brInputFileM != null){ brInputFileM.close(); } if(bwOutputFileA != null){ bwOutputFileA.close(); } } catch (IOException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } } /** * 日付の妥当性をチェック * カレンダーに存在するかどうかを返す。 * @param strDate チェック対象の文字列 * @return 存在する日付の場合true */ public static boolean checkDate(String strDate) { if (strDate == null || strDate.length() != 8) { throw new IllegalArgumentException( "引数の文字列["+ strDate +"]" + "は不正です。"); } DateFormat format = DateFormat.getDateInstance(); format.setLenient(false); try { format.parse(strDate); return true; } catch (Exception e) { return false; } } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

回答はswordoneさんの言う通りですが、せっかく作ったのでJava 8の新しいTime API版を貼り付けておきます。

Java

1import java.time.LocalDate; 2import java.time.DateTimeException; 3import java.time.format.DateTimeFormatter; 4import java.time.format.ResolverStyle; 5// ... 6private static final DateTimeFormatter dtf = DateTimeFormatter 7 .ofPattern("uuuuMMdd") 8 .withResolverStyle(ResolverStyle.STRICT); 9public static boolean checkDate(String strDate) { 10 if (strDate == null || strDate.length() != 8) { 11 throw new IllegalArgumentException( 12 "引数の文字列["+ strDate +"]" + 13 "は不正です。"); 14 } 15 try { 16 LocalDate.parse(strDate, dtf); 17 return true; 18 } catch (DateTimeException e) { 19 return false; 20 } 21}

何が違うのか?

  1. DateTimeFormatterはDateFormatと異なりスレッドセーフなので、一つだけstaticに作成して、使い回しができる。(DateFormatの場合は毎回作らないとスレッドセーフにならない、そして、その生成は遅い)
  2. 処理自体がDateFormatより高速らしい。
  3. 年は"yyyy"ではなく"uuuu"になる。(これに気付くのに30分ほどはまりました)

参考: Java日付時刻フォーマッターメモ(Hishidama's Java8 DateTimeFormatter Memo)

投稿2016/03/06 13:50

raccy

総合スコア21733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

自分の環境で試してみましたが、DateFormat.getDateInstance()で返ってくるDateFormatが持つ(このロケールでの)フォーマットはyyyy/MM/ddのようです。
そのため、自分でDateFormatを作成するのが早いかと思います。
DateFormat.getDateInstance()の行を以下に変えてください。

java

1DateFormat format = new SimpleDateFormat("yyyyMMdd");

投稿2016/03/06 13:20

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lena

2016/03/10 11:20

お礼が遅くなりましたが、無事解決できました。 ありがとうございました。
guest

0

日付の書式がyyyyMMddのためfalseになっていますね

java

1public static void main(String[] args) { 2 System.out.println(checkDate("20160227")); // false 3 System.out.println(checkDate("2016-02-27")); // false 4 System.out.println(checkDate("2016/02/27")); // true 5 System.out.println(checkDate("2016/02/29")); // true 6 System.out.println(checkDate("2015/02/29")); // false 7} 8 9public static boolean checkDate(String strDate) { 10 DateFormat format = DateFormat.getDateInstance(); 11 format.setLenient(false); 12 try { 13 format.parse(strDate); 14 return true; 15 } catch (Exception e) { 16 return false; 17 } 18}

このように修正するとyyyyMMddでtrueが返るようになります。

java

1public static void main(String[] args) { 2 System.out.println(checkDate("20160227")); // true 3 System.out.println(checkDate("2016-02-27")); // false 4 System.out.println(checkDate("2016/02/27")); // false 5 System.out.println(checkDate("2016/02/29")); // false 6 System.out.println(checkDate("2015/02/29")); // false 7} 8 9public static boolean checkDate(String strDate) { 10 DateFormat format = DateFormat.getDateInstance(); 11 format.setLenient(false); 12 try { 13 format.parse(strDate); 14 return true; 15 } catch (Exception e) { 16 return false; 17 } 18}

投稿2016/03/06 12:54

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/03/07 01:18

コメントからコピペしたので誤った回答をしてしまいました。 正しくはswordoneさんのとおりです。失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問