web-dev-qa-db-ja.com

javaの日付オブジェクトに時刻を設定する方法

JavaでDateオブジェクトを作成しました。そうすると、date=Tue Aug 09 00:00:00 IST 2011のように表示されます。その結果、Excelファイルは1日分少なくなっているようです(27 febは26 febになります)。午後5時30分などに設定するにはどうすればよいですか?

60
CyprUS
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY,17);
cal.set(Calendar.MINUTE,30);
cal.set(Calendar.SECOND,0);
cal.set(Calendar.MILLISECOND,0);

Date d = cal.getTime();

こちらもご覧ください

137
Jigar Joshi

日付オブジェクトの設定に使用するコードを表示できますか?とにかく<あなたは日付の初期化にこのコードを使用できます:

new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("2011-01-01 00:00:00")
14
Eugene Burtsev

現代の答えに貢献したいと思います。これには、Java.time、最新のJava日時APIを使用する必要があり、それを回避する方法がない場合を除き、古いDateCalendarも使用しません。

あなたの問題はタイムゾーンの問題である可能性が非常に高いです。 Tue Aug 09 00:00:00 IST 2011の場合、ISTの西のタイムゾーンでは真夜中にはまだ到達していません。まだ8月8日です。たとえば、日付をExcelに入力するAPIがUTCを想定している場合、日付は意図した日付の前日になります。本当の良い解決策は、00:00 UTCの日付時刻を作成することだと思います(または、相手側で予想され使用されるタイムゾーンまたはオフセットは何でも)。

    LocalDate yourDate = LocalDate.of(2018, Month.FEBRUARY, 27);
    ZonedDateTime utcDateDime = yourDate.atStartOfDay(ZoneOffset.UTC);
    System.out.println(utcDateDime);

これは印刷します

2018-02-27T00:00Z

ZはUTCを意味します(UTCまたはZuluタイムゾーンからのオフセットゼロと考えてください)。もちろん、LocalDateを最初のコード行からExcelに渡すことができればなおさらです。時刻は含まれていないため、混乱はありません。一方、昔ながらのDateオブジェクトが必要な場合は、Dateを渡す直前に変換します。

    Date oldfashionedDate = Date.from(utcDateDime.toInstant());
    System.out.println(oldfashionedDate);

私のコンピューターではこれが印刷されます

Tue Feb 27 01:00:00 CET 2018

だまされてはいけません、それは正しいです。私のタイムゾーン(中央ヨーロッパ標準時)は2月のUTC(標準時)からのオフセット+01:00にあるため、ここの01:00:00は00:00:00 UTCと等しくなります。これは、単にDate.toString() JVMのタイムゾーンを取得し、それを使用して文字列を生成するだけです。

午後5時30分などに設定するにはどうすればよいですか?

直接の質問に直接答えるには、ZonedDateTimeOffsetDateTime、またはLocalDateTimeがある場合、これらのすべての場合において、次のことで要求を達成できます。

    yourDateTime = yourDateTime.with(LocalTime.of(17, 30));

yourDateTime2018-02-27T00:00LocalDateTimeであった場合、2018-02-27T17:30になります。同様に、他のタイプについては、必要に応じてオフセットとタイムゾーンのみが含まれます。

上記の最初のスニペットのように日付しかなかった場合は、それに時刻情報を追加することもできます。

    LocalDate yourDate = LocalDate.of(2018, Month.FEBRUARY, 27);
    LocalDateTime dateTime = yourDate.atTime(LocalTime.of(17, 30));

ほとんどの場合、特定のタイムゾーンに時刻を追加することをお勧めしますが、たとえば

    ZonedDateTime dateTime = yourDate.atTime(LocalTime.of(17, 30))
            .atZone(ZoneId.of("Asia/Kolkata"));

これにより、2018-02-27T17:30+05:30[Asia/Kolkata]が生成されます。

DateおよびCalendar vs Java.time

使用するDateクラス、および他の回答で使用されるCalendarおよびSimpleDateFormatはかなり古く、特にSimpleDateFormatは面倒です。いずれの場合も、最新のJava日時APIを使用する方がはるかに優れています。これが、私がまだ訪れている古い質問にこの答えを提供したかった理由です。

リンク:Oracle Tutorial Date TimeJava.timeの使用方法の説明。

5
Ole V.V.