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

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

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

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

Q&A

解決済

1回答

9703閲覧

フォーマットチェック+日付チェックの方法

TEKETEKE75180

総合スコア12

Java

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

0グッド

0クリップ

投稿2016/12/12 09:18

編集2016/12/12 09:22

現在、java7で開発を行っています。

ある入力値に対して、タイトルにあるチェックを行いたいと考えています。
具体的には、

①入力値が「日にち+時間+タイムゾーン」のフォーマットにあっているか
②入力値の「日にち+時間」の部分が、日時的に正しいか
というチェックを行いたいと思っています。

今私が考えているイメージとしては、

正規表現「\d{4}/\d{1,2}/\d{1,2} \d{1,2}:\d{1,2}:\d{1,2} UTC[+-]\d{1,2}:\d{1,2}」として、チェックでひっかかればフォーマットエラー

①がOKな場合、
DateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss z");
sdf.setLenient(false);
として、sdf.parse("入力値")した際にExceptionが発生すれば日時が正しくないエラー

となるのですが、これよりもスマートに(ロジックとしても簡潔に)チェックできるような
気がしているのですが、この方法で問題ないでしょうか。

もし、これよりもいいチェック方法があれば、ご教示いただけますでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

②だけで駄目な理由は何でしょう?


ParsePositionオブジェクトを作っておくのがいいでしょう。parseメソッドはこのParsePositionオブジェクトを内部で作成しており、解析後このオブジェクトがもつ解析位置が0(つまり解析エラーが発生した)の時、ParseExceptionが発生する仕組みになっています。
ParsePositionは解析位置のほか、エラー発生位置も保持します。この数値から、何が原因でエラーになったかある程度分類することができます。

java

1public static void main(String[] args) { 2 DateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss z"); 3 sdf.setLenient(false); 4 String target = "2016/12/12 12:12:12 UTC*9:00"; 5 ParsePosition pos = new ParsePosition(0); 6 Date date = sdf.parse(target, pos); 7 //インデックスが文字列長と一致しなければ、何らかの不具合 8 if (pos.getIndex() != target.length()) { 9 //エラーインデックスが文字列長と同じなら、最後まで解析できたものの厳密に解釈してありえない日時だった 10 if (pos.getErrorIndex() == target.length()) { 11 System.out.println("日時エラーです。"); 12 //それ以外は、途中で解析不能な文字が紛れた、あるいは途中で解析が終了して文末を解析しなかった 13 } else { 14 System.out.println("フォーマットエラーです。"); 15 } 16 } 17}

ちなみに、DateFormat系ではUTC+9:00のようなタイムゾーン指定はできません。GMT+9:00のように、GMTでないといけません。UTC+9:00と書いても、UTCまでで解析が終了し、UTCタイムゾーンと解釈されます。

投稿2016/12/12 09:28

編集2016/12/12 17:26
swordone

総合スコア20651

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

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

TEKETEKE75180

2016/12/12 09:43

私が試したところ、②だけだと 「2016/12/12 12:12:12 aTC+9:00」(UTCではなくaTC)や 「2016/12/12 12:12:12 UTC*9:00」(UTCの後の文字が「*」になっている)が parseでエラーにならなかったので、①も必要かと考えました。
TEKETEKE75180

2016/12/12 09:44

失礼いたしました。 「2016/12/12 12:12:12 aTC+9:00」はParseExceptionになりました。
TEKETEKE75180

2016/12/14 06:22

申し訳ありません。記載しておりませんでしたがユーザにはUTCタイムゾーンのみを入力させたいので、swordoneさんに載せていただいたロジックですと、UTCタイムゾーンを入力した時にフォーマットエラーになります。 やはり、正規表現でチェックをかけ、DateFormatで日時が正しいか チェックをするしかないのでしょうか。
swordone

2016/12/14 13:35

上記にも書いたとおり、DateFormatはUTC+9のようなタイムゾーン指定を受け付けないため、DateFormatを使うこと自体、無理のようです。
TEKETEKE75180

2016/12/15 01:31

受け付けないというのはエラーになってしまうという意味でしょうか。 私がローカルで試したところ、UTC+9:00のようなタイムゾーンを指定してもエラーにはなりませんでした。 なので、DateFormatでは、あくまでもUTCより前の「yyyy/MM/dd HH:mm:ss」の日時正当性チェックにのみ使用する想定です。
swordone

2016/12/15 01:43

そもそもUTCもGMTも意味はほぼ同じなのだから、UTCにこだわる理由もないように思いますがね。 だったらUTC~の部分だけ正規表現で判定するなりすればいいでしょう。 判定用にUTCをGMTに置換すればDateFormat一発で済みますが。 > 私がローカルで試したところ、UTC+9:00のようなタイムゾーンを指定してもエラーにはなりませんでした。 エラーにならないだけで、解析は"UTC"で止まり、後続の"+9:00"が解析されないのですよ。 まあ、DateFormatでそこを見ないのならどうでもいいのですが。
TEKETEKE75180

2016/12/16 05:30

>エラーにならないだけで、解析は"UTC"で止まり、後続の"+9:00"が解析されないのですよ。 上の方にも書いてありましたね。失礼いたしました。 上記を考慮し、自分でもう少し考えてみます。 お教えいただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問