web-dev-qa-db-ja.com

Java 8で日付を月に切り捨てることは可能ですか?

ミリ秒を数日に切り捨てたいのですが、

Instant.now().truncatedTo(ChronoUnit.DAYS).toEpochMilli()

しかし、ChronoUnit.MONTHに切り捨てることはできません(例外がスローされます)。 a Calendar を使用する必要がありますか?

19
EnverOsmanov

1つの方法は、手動で日を月の最初に設定することです。

import static Java.time.ZoneOffset.UTC;
import static Java.time.temporal.ChronoUnit.DAYS;

ZonedDateTime truncatedToMonth = ZonedDateTime.now(UTC).truncatedTo(DAYS).withDayOfMonth(1);
System.out.println(truncatedToMonth); //prints 2015-06-01T00:00Z
long millis = truncatedToMonth.toInstant().toEpochMilli();
System.out.println(millis); // prints 1433116800000

または、LocalDateを使用した代替方法は、おそらくよりクリーンです。

LocalDate firstOfMonth = LocalDate.now(UTC).withDayOfMonth(1);
long millis = firstOfMonth.atStartOfDay(UTC).toEpochSecond() * 1000;
//or
long millis = firstOfMonth.atStartOfDay(UTC).toInstant().toEpochMilli();
16
assylias

これは何 Java.time.temporal.TemporalAdjustersが対象です。

date.with(TemporalAdjusters.firstDayOfMonth()).truncatedTo(ChronoUnit.DAYS);
22
Simon

それを行う簡単な方法については:

Calendar cal = new GregorianCalendar();
System.out.println(cal.getTime());

cal.set(Calendar.DAY_OF_MONTH,1);
System.out.println(cal.getTime());

cal.set(Calendar.HOUR_OF_DAY,0);
System.out.println(cal.getTime());

cal.set(Calendar.MINUTE,0);
System.out.println(cal.getTime());

cal.set(Calendar.SECOND,0);
System.out.println(cal.getTime());

cal.set(Calendar.MILLISECOND,0);
System.out.println(cal.getTime());

出力は次のとおりです。

Thu Jun 11 05:36:17 EDT 2015
Mon Jun 01 05:36:17 EDT 2015
Mon Jun 01 00:36:17 EDT 2015
Mon Jun 01 00:00:17 EDT 2015
Mon Jun 01 00:00:00 EDT 2015
Mon Jun 01 00:00:00 EDT 2015
0
MozenRath

もちろんインスタントを操作するときに同じ問題があり、次のコードで問題が解決しました:

Instant instant = Instant.ofEpochSecond(longTimestamp);
instant = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()).with(TemporalAdjusters.firstDayOfMonth())
            .truncatedTo(ChronoUnit.DAYS).toInstant();
0
epcpu