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

时间:2011-03-02 09:14:53

标签: java date datetime calendar

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

4 个答案:

答案 0 :(得分:134)

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();

另见

答案 1 :(得分:14)

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

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

答案 2 :(得分:5)

我想提供现代答案。这涉及使用java.time,现代Java日期和时间API,而不是旧的DateCalendar,除非无法避免它。

您的问题很可能是一个时区问题。如果是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);

打印

2018-02-27T00:00Z

Z表示UTC(将其视为UTC或祖鲁时区的偏移零)。当然,更好的是,如果您可以将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?

要直接回答您的直接问题,如果您有ZonedDateTimeOffsetDateTimeLocalDateTime,则在以下所有情况下,以下内容都可以满足您的要求:

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

如果yourDateTimeLocalDateTime的{​​{1}},则现在为2018-02-27T00:00。类似地,对于其他类型,它们也适当地包括偏移和时区。

如果您只有一个日期,就像上面的第一个代码段一样,您还可以向其添加时间信息:

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 vs Calendar

您使用的java.time课程以及其他答案中使用的DateCalendar已经过时了,特别是SimpleDateFormat已经证明很麻烦。在所有情况下,现代Java日期和时间API都可以更好地使用。这就是为什么我想为仍在访问的旧问题提供这个答案。

链接: Oracle Tutorial Date Time,解释如何使用SimpleDateFormat

答案 3 :(得分:0)

如果您无权使用Java 8和API java.time,这是我的简单函数,可使用旧的java.util.Calendar(由Jigar Joshi启发)将一个日期的时间复制到另一个日期:

/**
 * Copy only the time of one date to the date of another date.
 */
public static Date copyTimeToDate(Date date, Date time) {
    Calendar t = Calendar.getInstance();
    t.setTime(time);

    Calendar c = Calendar.getInstance();
    c.setTime(date);
    c.set(Calendar.HOUR_OF_DAY, t.get(Calendar.HOUR_OF_DAY));
    c.set(Calendar.MINUTE, t.get(Calendar.MINUTE));
    c.set(Calendar.SECOND, t.get(Calendar.SECOND));
    c.set(Calendar.MILLISECOND, t.get(Calendar.MILLISECOND));
    return c.getTime();
}