如何在java中设置日期对象的时间

Cyp*_*rUS 60 java datetime calendar date

Date用Java 创建了一个对象.当我这样做时,它显示如下:date=Tue Aug 09 00:00:00 IST 2011.结果,似乎我的Excel文件减少了一天(27 feb变为26 feb,依此类推)我认为一定是因为时间.我怎样才能把它设置为下午5:30?

Jig*_*shi 138

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();
Run Code Online (Sandbox Code Playgroud)

另见

  • 仅供参考,非常麻烦的日期时间类,例如 [`java.util.Date`](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util /Date.html), [`java.util.Calendar`](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Calendar.html)和 `java.text.SimpleDateFormat` 现在是[遗留](https://en.wikipedia.org/wiki/Legacy_system),被[*java.time*](https://docs.oracle.com /javase/tutorial/datetime/TOC.html) Java 8 及更高版本中内置的类。 (2认同)

Eug*_*sev 16

你能展示用于设置日期对象的代码吗?无论如何<您可以使用此代码初始化日期:

new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("2011-01-01 00:00:00")
Run Code Online (Sandbox Code Playgroud)


Ole*_*.V. 6

我想贡献现代的答案。这包括使用java.time,现代的Java日期和时间API,而不是旧的Date,也Calendar除非有没有办法避免。

您的问题很可能确实是时区问题。在IST 2011年8月9日星期二00:00:00时,尚未到达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);
Run Code Online (Sandbox Code Playgroud)

此打印

2018-02-27T00:00Z
Run Code Online (Sandbox Code Playgroud)

Z表示UTC(将其视为UTC或Zulu时区的零偏移量)。当然,更好的是,如果您可以将LocalDate第一行代码中的传递给Excel。它不包含时间,因此不会造成混乱。另一方面,如果您需要一个老式的Date对象,请在进行操作之前进行转换Date

    Date oldfashionedDate = Date.from(utcDateDime.toInstant());
    System.out.println(oldfashionedDate);
Run Code Online (Sandbox Code Playgroud)

在我的计算机上打印

Tue Feb 27 01:00:00 CET 2018
Run Code Online (Sandbox Code Playgroud)

不要上当,这是正确的。我的时区(欧洲中部时间)在2月(标准时间)与UTC的时差为+01:00,因此此处的01:00:00等于UTC的00:00:00。它只是Date.toString()抓住JVM时区,并使用它来产生字符串。

如何将其设置为下午5:30?

要直接回答你直接的问题,如果你有一个ZonedDateTimeOffsetDateTime或者LocalDateTime,在所有这些情况下,下面将完成你的要求为:

    yourDateTime = yourDateTime.with(LocalTime.of(17, 30));
Run Code Online (Sandbox Code Playgroud)

如果yourDateTimeLocalDateTime的话2018-02-27T00:00,现在将会是2018-02-27T17:30。类似地,对于其他类型,也仅在适当时包括偏移量和时区。

如果您只有日期,如上面的第一个片段中所示,还可以向其中添加日期信息:

    LocalDate yourDate = LocalDate.of(2018, Month.FEBRUARY, 27);
    LocalDateTime dateTime = yourDate.atTime(LocalTime.of(17, 30));
Run Code Online (Sandbox Code Playgroud)

对于大多数用途,您应该更喜欢在特定时区中添加日期,例如

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

这产生了2018-02-27T17:30+05:30[Asia/Kolkata]

DateCalendarVSjava.time

Date您使用以及类CalendarSimpleDateFormat在其他的答案中使用的早已过时的,并且SimpleDateFormat特别是已被证明麻烦。在所有情况下,现代Java日期和时间API都可以更好地使用。这就是为什么我想为仍在访问的一个老问题提供此答案。

链接: Oracle Tutorial Date Time,说明了如何使用java.time