JavaでDate
オブジェクトを作成しました。そうすると、date=Tue Aug 09 00:00:00 IST 2011
のように表示されます。その結果、Excelファイルは1日分少なくなっているようです(27 febは26 febになります)。午後5時30分などに設定するにはどうすればよいですか?
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();
こちらもご覧ください
日付オブジェクトの設定に使用するコードを表示できますか?とにかく<あなたは日付の初期化にこのコードを使用できます:
new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("2011-01-01 00:00:00")
現代の答えに貢献したいと思います。これには、Java.time
、最新のJava日時APIを使用する必要があり、それを回避する方法がない場合を除き、古いDate
もCalendar
も使用しません。
あなたの問題はタイムゾーンの問題である可能性が非常に高いです。 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分などに設定するにはどうすればよいですか?
直接の質問に直接答えるには、ZonedDateTime
、OffsetDateTime
、またはLocalDateTime
がある場合、これらのすべての場合において、次のことで要求を達成できます。
yourDateTime = yourDateTime.with(LocalTime.of(17, 30));
yourDateTime
が2018-02-27T00:00
のLocalDateTime
であった場合、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 Time 、Java.time
の使用方法の説明。