我用Java创建了一个Date对象。 当我这样做时,它显示类似:date=Tue Aug 09 00:00:00 IST 2011。 结果,我的Excel文件似乎减少了一天(27 feb变为26 feb,依此类推),我认为这一定是由于时间的原因。 如何将其设置为下午5:30?
相关:Java日期截止时间信息
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();
另请参阅
乔达时间
日历文件
谢谢。 我得到了答案。 我在下面发布了链接。
是手段(日期17:30:0:0)吗?
仅供参考,现在麻烦的日期时间类(例如java.util.Date,java.util.Calendar和java.text.SimpleDateFormat)已成为旧版,由Java 8和更高版本中内置的java.time类取代。
您可以显示用于设置日期对象的代码吗?无论如何
new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("2011-01-01 00:00:00")
DateFormat formatter = new SimpleDateFormat(" yyyy-MM-dd"); 日期date =(Date)formatter.parse(st [length]); System.out.print(" date =" + date); cal.setTime(date); cal.set(Calendar.HOUR_OF_DAY,17); cal.set(Calendar.MINUTE,30); cal.set(Calendar.SECOND,0); cal.set(Calendar.MILLISECOND,0); 日期= cal.getTime(); System.out.print(" date =" + date);
我将时间设置为下午5:30。
我想贡献现代的答案。这涉及使用现代的Java日期和时间API java.time,而不是旧的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或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等于UTC的00:00:00。只是Date.toString()抓住JVM时区并将其用于生成字符串。
How can I set it to something like 5:30 pm?
为了直接回答您的直接问题,如果您有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与java.time
您使用的Date类以及其他答案中使用的Calendar和SimpleDateFormat早已过时,尤其是SimpleDateFormat证明是麻烦的。在所有情况下,现代Java日期和时间API都可以更好地使用。这就是为什么我想为仍在访问的一个老问题提供此答案。
链接:Oracle教程日期时间,说明如何使用java.time。
如果您无权使用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();
}
仅供参考,现在麻烦的日期时间类(例如java.util.Date,java.util.Calendar和java.text.SimpleDateFormat)已成为旧版,由Java 8和更高版本中内置的java.time类取代。