我在Java中创建了一个Date
对象。当我这样做时,它会显示如下内容:date=Tue Aug 09 00:00:00 IST 2011
。结果,似乎我的Excel文件减少了一天(27 feb变为26 feb,依此类推)我认为一定是因为时间。我怎样才能把它设置为下午5:30?
答案 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,而不是旧的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);
打印
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?
要直接回答您的直接问题,如果您有ZonedDateTime
,OffsetDateTime
或LocalDateTime
,则在以下所有情况下,以下内容都可以满足您的要求:
yourDateTime = yourDateTime.with(LocalTime.of(17, 30));
如果yourDateTime
是LocalDateTime
的{{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
课程以及其他答案中使用的Date
和Calendar
已经过时了,特别是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();
}