回答:
日付/時刻操作を行うための推奨される方法は、Calendar
オブジェクトを使用することです。
Calendar cal = Calendar.getInstance(); // locale-specific
cal.setTime(dateObject);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
long time = cal.getTimeInMillis();
Apache Commons LangのDateUtils truncateメソッドを見たことはありますか?
Date truncatedDate = DateUtils.truncate(new Date(), Calendar.DATE);
時間要素を削除します。
ジョーダを見た?それはだ非常に日付と時刻との仕事へのより簡単かつ直感的な方法。たとえば、あなたは、(例えば)との間で変換することができ自明のLocalDateTimeとLOCALDATEオブジェクト。
例(APIを説明するため)
LocalDate date = new LocalDateTime(milliseconds).toLocalDate()
さらに、日付/時刻フォーマッタのいくつかのスレッド安全性の問題を解決し、Javaで日付/時刻の問題を処理する場合に強くお勧めします。
現在、Java 8以降に組み込まれているjava.timeクラスに照らして簡単に更新します。
LocalDateTime
持っているtruncatedTo
あなたはおよそここで話しているものを効果的にアドレスする方法を:
LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES)
これにより、現在の時刻が分単位まで表示されます。
2015-03-05T11:47
DAYSより小さいChronoUnit
(またはTemporalUnit
)を使用して切り捨てを実行できます(切り捨てはLocalDateTimeの時刻部分にのみ適用され、日付部分には適用されません)。
Jodaを使用すると、簡単に予定日を取得できます。
バージョン2.7(おそらく2.2よりも前のいくつかのバージョン以降)では、コメントとして、toDateMidnight
非推奨になり、適切に名前が付けられたwithTimeAtStartOfDay()
ため、
DateTime.now().withTimeAtStartOfDay()
可能。
より良いAPIの利点が追加されました。
古いバージョンでは、次のことができます
new DateTime(new Date()).toDateMidnight().toDate()
withTimeAtStartOfDay
。
toLocalDate
して、時間コンポーネントさえ持たないオブジェクトを取得することもできます。
新しいjava8 APIで切り捨てを行いました。私は奇妙なことに直面しましたが、一般的にそれは切り捨てられています...
Instant instant = date.toInstant();
instant = instant.truncatedTo(ChronoUnit.DAYS);
date = Date.from(instant);
次のように、ApacheのDateUtilsを切り捨てて使用します。
DateUtils.truncate(Calendar.getInstance().getTime(), Calendar.DATE);
タイムスタンプの場合:
timestamp -= timestamp % (24 * 60 * 60 * 1000)
java.util.Date JavaDocsから:
クラスDateは、特定の瞬間をミリ秒の精度で表します
そして、java.sql.Date JavaDocsから:
SQL DATEの定義に準拠するには、インスタンスが関連付けられている特定のタイムゾーンで時間、分、秒、ミリ秒をゼロに設定して、java.sql.Dateインスタンスでラップされたミリ秒の値を「正規化」する必要があります。 。
したがって、時間部分が必要ない場合は、java.sql.Dateを使用するのが最善の方法です。
java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());
そして出力は:
java.util.Date : Thu Apr 26 16:22:53 PST 2012
java.sql.Date : 2012-04-26
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.toString() // Generate a String in standard ISO 8601 format, wisely extended to append the name of the time zone in square brackets.
2008-01-01T00:00 + 01:00 [ヨーロッパ/パリ]
目的の形式で文字列を生成するには、を渡しますDateTimeFormatter
。
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.format( // Generate a String representing the object’s value.
DateTimeFormatter.ISO_LOCAL_DATE_TIME // Built-in predefined formatter close to what you want.
)
.replace( "T" , " " ) // Replace the standard’s use of a 'T' in the middle with your desired SPACE character.
2008-01-01 00:00:00
他の答えは正しいですが、java.timeフレームワークでは時代遅れになった古い日時クラスを使用してください。
java.timeフレームワークは、Java 8以降に組み込まれています。java.time機能の多くは、Java 6および7(ThreeTen-Backport)にバックポートされ、さらにAndroid(ThreeTenABP)に適合しています。
最初に、ISO 8601形式の正規バージョンに準拠するように入力文字列を変更します。標準のISO 8601形式は、java.timeクラスのデフォルトで、日時値を表す文字列の解析/生成に使用されます。途中のSPACEをに置き換える必要がありT
ます。
String input = "2008-01-01 13:15:00".replace( " " , "T" ); // → 2008-01-01T13:15:00
これをとして解析できますLocalDateTime
。「ローカル」は特定の場所を意味しません。入力には、UTCからのオフセットまたはタイムゾーン情報がありません。
LocalDateTime ldt = LocalDateTime.parse( input );
ldt.toString()…2008-01-01T13:15:00
時刻やタイムゾーンを気にしない場合は、に変換してくださいLocalDate
。
LocalDate ld = ldt.toLocalDate();
ld.toString()…2008-01-01
代わりに、時刻をその日の最初の瞬間に設定する場合は、ZonedDateTime
クラスを使用してから、LocalDate
オブジェクトに変換してそのatStartOfDay
メソッドを呼び出します。00:00:00
夏時間またはその他の異常のため、最初の瞬間が時間ではない可能性があることに注意してください。
特定の瞬間に日付が世界中でゾーンによって異なるため、タイムゾーンは重要です。たとえば、真夜中のパリは、パリジャンにとって新しい日ですが、モントリオールではカナダ人にとってまだ「昨日」です。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
LocalDate ldFromZdt = zdt.toLocalDate();
ZonedDateTime zdtStartOfDay = ldFromZdt.atStartOfDay( zoneId );
zdtStartOfDay.toString()…2008-01-01T00:00:00-05:00 [アメリカ/モントリオール]
UTCタイムゾーンのレンズを通してその瞬間を確認するには、Instant
オブジェクトを抽出します。どちらZonedDateTime
とInstant
タイムライン上の同じ瞬間を表すが、2つの異なるとして表示されます壁時計の時間。
アンはInstant
常にUTCで定義することにより、java.timeにおける基本的なビルディング・ブロックのクラスです。通常はビジネスロジック、データストレージ、およびデータ交換をUTCで行う必要があるため、このクラスを頻繁に使用します。
Instant instant = zdtStartOfDay.toInstant();
instant.toString()…2008-01-01T05:00:00Z
真夜中のストロークではなく、午前5時が表示されます。標準形式ではZ
、末尾のはZulu
「UTC」の略で、「UTC」を意味します。
java.timeのフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスをjava.util.Date
、Calendar
、& SimpleDateFormat
。
ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。
詳細については、Oracleチュートリアルを参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。
java.timeオブジェクトをデータベースと直接交換することができます。JDBC 4.2以降に準拠したJDBCドライバーを使用します。文字列もクラスも必要ありません。java.sql.*
java.timeクラスはどこで入手できますか?
ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがInterval
、YearWeek
、YearQuarter
、および多くを。
Calendarクラスのset()
メソッドを使用してHOUR_OF_DAY, MINUTE, SECOND
、MILLISECOND
フィールドをゼロに設定します。
質問は矛盾しています。時刻なしの日付を要求しますが、時刻がの例を表示します00:00:00
。
UPDATE:ジョダタイムプロジェクトは、今でメンテナンスモードへの移行を助言チームと、java.timeのクラス。java.timeソリューションに関する他の回答を参照してください。
代わりに、時刻をその日の最初の瞬間に設定したい場合DateTime
は、Joda-Timeライブラリーのオブジェクトを使用して、そのwithTimeAtStartOfDay
メソッドを呼び出します。00:00:00
夏時間またはその他の異常のため、最初の瞬間が時間ではない可能性があることに注意してください。
ただ、clear()
冗長フィールド。
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.clear(Calendar.MINUTE);
calendar.clear(Calendar.SECOND);
calendar.clear(Calendar.MILLISECOND);
Date truncatedDate = calendar.getTime();
Java 8以降でtruncatedTo
はLocalDateTime
、のメソッドを使用することをお勧めします。例:
LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)
calendar.clear(Calendar.HOUR_OF_DAY);
時間をクリアしないため、これは機能しません。@cletusのソリューションは問題なく動作します。
新しい「改善された」カレンダーコンストラクターは、「ひどい」古い日付のように、ミリ秒の間intを取りません。それから私は本当にクロスしてこれを書きました:
long stuffYou = startTime.getTimeInMillis() % 1000;
startTime.setTimeInMillis(startTime.getTimeInMillis() - stuffYou);
当時は「もの」という言葉は使っていませんでしたが、その幸福を発見しました。
startTime.set(Calendar.MILLISECOND, 0);
しかし、私はまだそれについてかなりクロスしています。
私はこのように問題を修正しました(東部の8つのゾーン(北京時間)):
private Date getTruncatedDate(Date d) {
if (d == null) {
return null;
}
long h = 60 * 60 * 1000L;
long dateStamp = d.getTime() - (d.getTime() + 8 * h) % (24 * h);
return new Date(dateStamp);
}
まず、タイムスタンプとは何かを明確にする必要があります。タイムスタンプは、GMTの1月1日00:00:00 1970(UTCと同じ)、またはThu Jan 01 08:00:00 CST 1970から現在までの合計ミリ秒です。
注意:タイムスタンプはタイムゾーンに依存しません。
したがって、異なるタイムゾーンで次のステートメントを使用しても同じ結果が得られます。
System.out.println(new Date().getTime());
そして
System.out.println(new Date(0));
異なるタイムゾーンで異なる時間情報を出力します。PCタイムゾーンをUTCに設定すると、
Thu Jan 01 00:00:00 UTC 1970
しかし、タイムゾーンを(UTC +8:00)北京、重慶、香港、ウルムクに設定すると、次のようになります。
Thu Jan 01 08:00:00 CST 1970
Javaはタイムスタンプを取得し、タイムゾーンに従って日付と時刻の情報を表示します。
Javaが異なるタイムゾーンで日付と時刻の情報を表示する方法の紹介では、時刻の情報を変換する方法は簡単です。タイムスタンプを取得し、時間情報を切り取るときにタイムゾーンを考慮する必要があります。次に、カットタイムスタンプ(日付スタンプと呼ぶことができます)を使用して新しいDateオブジェクトを作成できます。Javaは日付情報を表示するときにタイムゾーンを補正します。
東部8ゾーン(北京時間)と同様に、北京時間はGMTより8時間早いので、モジュロ演算を行う場合はさらに8時間差し引く必要があります。つまり、最初にGMT時刻を取得する必要があります。次に、PCのタイムゾーン設定に基づいてJavaが表示時刻を8時間追加します。
タイムゾーンの問題はあいまいであり、長い間私も困惑しています。今私はそれを明確にします。願っています。
2018-01-04以下の方法でも動作します。
private Date getTruncatedDate2(Date d) {
Calendar cal = Calendar.getInstance(); // locale-specific
cal.setTime(d);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
これを行うと、タイムゾーンの問題を回避できます。
public static Date truncDate(Date date) {
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
Java Date
オブジェクトはタイムスタンプ値ですが、トランケート中にローカルタイムゾーンに変換されるため、UTCタイムゾーンからの値を期待している場合、驚くべき値が得られます。
Calendar
とDate
クラスがでレガシー年前になったjava.timeのジャワ8以降でJSR 310を実装するクラス。2018年にそれらを使用することを提案することはあまりお勧めできません。
ジョダタイムバージョン2.0以降を使用できLocalDate.toDate()
。
単に
// someDatetime is whatever java.util.Date you have.
Date someDay = new LocalDate(someDatetime).toDate();
a Java Date object
私が使用したものjava.util.Date
でした。さらに、彼のタイムゾーンがjava.util.Dateでどのように問題があるか(いつ?どこで?)についても説明していませんが、以外は使用できませんDate
。
カレンダーを使用したすべての回答については、代わりにこのように使用する必要があります
public static Date truncateDate(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
c.set(Calendar.HOUR_OF_DAY, c.getActualMinimum(Calendar.HOUR_OF_DAY));
c.set(Calendar.MINUTE, c.getActualMinimum(Calendar.MINUTE));
c.set(Calendar.SECOND, c.getActualMinimum(Calendar.SECOND));
c.set(Calendar.MILLISECOND, c.getActualMinimum(Calendar.MILLISECOND));
return c.getTime();
}
しかし、私はこれを好みます:
public static Date truncateDate(Date date) {
return new java.sql.Date(date.getTime());
}
java.sql.Date
このクラスは、日付のみの値を表すために、ふりが、実際の時刻UTCタイムゾーンの調整を持っています。したがって、質問に対する実際の解決策ではありません。
Java 8以降を使用している場合に時間なしで日付を取得する簡単な方法は次のとおりです。Dateではなくjava.time.LocalDateタイプを使用します。
LocalDate now = LocalDate.now();
System.out.println(now.toString());
出力:
2019-05-30
https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html
LocalDate
ほとんどの目的で使用することをお勧めしますが、質問からの入力でこれがどのように機能するかは不明2008-01-01 13:15:00
です。