2012-02-17 12 views
9

DateオブジェクトとdatetimeをDateオブジェクトとして格納しています。java.util.Dateオブジェクトに時間部分が含まれているかどうかを確認するにはどうすればよいですか?

しかし、後で、Dateオブジェクトが日付か日時かを判断できるようにする必要があります。

05/18/05 00:00:00と05/18:05の両方に時分があります。私は本当にそれらを区別することはできません。

+0

Javaは好奇心の疎外さを異にして、これは簡単に.NETで簡単です。 – Jason

+0

'カレンダーc = Calendar.getInstance();日付x; //いくつかのデータで ' ' c.setTime(x); c.get(Calendar.YEAR)//必要なフィールド –

+0

@Jason "date formats" in javaは、レンダリング/解析のためのものです。日付は、1970年以来ミリ秒のちょうどラップされた長さです。これはあなたが比較することができます。日付はフォーマットを「持たない」 - DateFormatオブジェクトによってフォーマットされます。 – Bohemian

答えて

3

java.util.Dateは実際には日付ではなく、日付として使用する方法がないため、日付ではありません。あなたは別のアプローチを考え出す必要があります。

+0

はい。このアプローチには欠陥があります。私たちは日付と日時のために異なるオブジェクトを持つ必要があります。 – thinkanotherone

+0

これは最高の答えとしてマークされたとは思えません。これは解決策ではなく、ただの意見です – FiruzzZ

0

Google's DateTimeライブラリを検証に使用することができます。

parseDateTimeメソッドとparseDateメソッドがあり、正しくフォーマットされていない場合はNumberFormatExceptionがスローされます。

その後、あなたは...私はJDBC ResultSetから入手したとして、彼らは彼らのスーパーjava.util.Date、右に対して宣言されている間、あなたが実際にjava.sql.Datejava.sql.Timestampインスタンスを扱っていることを理解し

try { 
    DateTime someVar = DateTime.parseDate("your_date_as_a_string"); 
} catch (java.lang.NumberFormatException nfe) { 
    // This isn't a date... 
} 

try { 
    DateTime someVar = DateTime.parseDateTime("your_date_as_a_string"); 
} catch (java.lang.NumberFormatException nfe) { 
    // This isn't a date/time... 
} 
+0

フロー制御に例外を使用しないでください! – Bohemian

+0

@ボヘミアン - ハァッですか?何故なの? –

+0

実際に、ユーザー入力(つまりWebフォーム上のテキストボックス)で作業する場合、ユーザーが日付を正しく入力したかどうかを確認する必要がある場合、提供された入力でパーサを使用することが私の唯一の方法ですそれを検証することを意識しています... –

0

ができますか?

その場合は、instanceofを使用してください。

if (date instanceof java.sql.Date) { 
    // It was originally a DATE. 
} else if (date instanceof java.sql.Timestamp) { 
    // It was originally a TIMESTAMP (DATETIME). 
} 
5

あなたの日付時刻が、彼らは00:00:00HH:mm:ssを持っていることはありません。すなわち、真夜中にならないことが保証されない限り、別に深夜になるために起こる「日付」と日付時刻を指示するいかなる固体方法はありません。

あなたの日付時刻は、その後、深夜になることはありません場合:

if (new SimpleDateFormat("HH:mm:ss").format(object).equals("00:00:00")) 

Dateオブジェクトが「日付」であるかどうかを判断するために行うだろう。

あなたのデザインに欠陥があり、別の解決策が見つかるはずです。私はまた、Dateクラスの名前に欠陥があり、この種の混乱を招くと思います。私はここに掲載、それは時間の部分を持っているかどうかを確認するために、生の時間値を改造に関するソリューションに同意するもののドミトリが言ったように

+0

'' 00:00:00 ".equals(新しいSimpleDateFormat(" hh:mm:ss ")。書式(オブジェクト));' – rptmat57

+0

あなたのポイントは何ですか? – Bohemian

+0

もう一方の側に文字列リテラルを置く方が良いでしょう。私はフォーマットメソッドがnullを返すとは思わないが – rptmat57

0

、欠陥がDate値が正確に深夜の時間部分を持っている場合、方法はありませんということです伝える。

ここで少し横向きに考えてみると、おそらくDateに拡張された独自のクラスを作成できます。この変数には、 "isDateTime"という名前のメンバ変数があります。次に、日付または日時の値を最初にロードするときに、その日時の有無に応じて真偽にブール値を設定します。

3

使用してApacheのコモンズ-LANG-3:解析のための

DateUtils.truncate(fecha, Calendar.DAY_OF_MONTH).equals(fecha) 
1

不要、フォーマットやサードパーティライブラリ。 あなたは簡単に行うことができます

Calendar c = ... 
c.setTime(date); 
//this doesn't care about nanos 
if(c.get(Calendar.HOUR_OF_DAY) + c.get(Calendar.MINUTE) + c.get(Calendar.SECOND) > 0) { 
.... 
} 

PDを:私は1000年から1025年でこれを行います。000のオブジェクトであり、パフォーマンスを危険にさらすようには見えませんが、もちろんこれはどこで、なぜこの操作をしたいのかに依存します

+0

このアプローチはより効果的ですか?時間部分を 'String'と比較する方法は_Bohemian_で記述されていますか? – dk7

+1

私が言ったように、この "アプローチ"はSimpleDateFormat(これは**安価なオブジェクトではありません**は、多くの時間を比較します)を作成する必要はありません。また、SDFはスレッドセーフではありません。コンテキスト(マルチスレッド)が失敗する可能性がありますが、トピックから外れている理由がいくつかあります – FiruzzZ

関連する問題