如何在Java中设置日期的最小小时数?

时间:2014-01-15 22:42:01

标签: java

我正在尝试获取上个月第一天的日期和时间;特别是因为它是1月我想要得到:Sun Dec 01 00:00:00 EST 2013。我正在使用下面的代码片段,我已经在Stackoverflow上找到了另一个代码片段,同时研究了这个主题;此代码段将返回:Sun Dec 01 12:00:00 EST 2013。我不明白为什么设置第1小时的最小小时实际上是中午返回。

Calendar aCalendar = Calendar.getInstance();
// add -1 month to current month
aCalendar.add(Calendar.MONTH, -1);
// set DATE to 1, so first date of previous month
//aCalendar.set(Calendar.DATE, 1);                        
aCalendar.set(Calendar.DATE, aCalendar.getActualMinimum(Calendar.DAY_OF_MONTH));
aCalendar.set(Calendar.HOUR, aCalendar.getActualMinimum(Calendar.HOUR));
aCalendar.set(Calendar.MINUTE, aCalendar.getActualMinimum(Calendar.MINUTE));
aCalendar.set(Calendar.SECOND, aCalendar.getActualMinimum(Calendar.SECOND));
Date firstDateOfPreviousMonth = aCalendar.getTime();

如果我修改了如下所示的行并设置为0,我得到相同的结果:

aCalendar.set(Calendar.HOUR, 0);

如果我修改如下,我得到下午1点:

aCalendar.set(Calendar.HOUR, 0);

结果:Sun Dec 01 13:00:00 EST 2013

2 个答案:

答案 0 :(得分:4)

来自Java Docs

  

小时获取和设置的字段编号,表示上午的小时   或下午。

您需要使用HOUR_OF_DAY代替

  

HOUR_OF_DAY get和set的字段编号,表示小时   一天。

或者相应地设置AM_PM ...

  

AM_PM获取和设置的字段编号,指示HOUR是否为   在中午之前或之后。

无论如何,请花点时间咨询Java Docs

答案 1 :(得分:0)

使用Joda-Time 2.3的一些示例代码。

使用默认时区,我们创建一个DateTime现在的实例(当前时刻),回到上个月(以聪明的方式,像2月一样补偿短月),通过询问获得月份的第一个月为“最低价值”,然后获得第一个月的第一个时刻。

org.joda.time.DateTime startOfPreviousMonth = new org.joda.time.DateTime().minusMonths(1).dayOfMonth().withMinimumValue().withTimeAtStartOfDay();

请注意方法withTimeAtStartOfDay以获取当天的第一时刻。该时刻可能是当地时间00:00:00(由于夏令时或其他异常),可能是00:00:00。

使用显式时区(几乎总是更好的做法)......

DateTimeZone timeZone = DateTimeZone.forId( "Europe/Paris" ); // "Asia/Kolkata" etc.
org.joda.time.DateTime startOfPreviousMonth = new org.joda.time.DateTime( timeZone ).minusMonths(1).dayOfMonth().withMinimumValue().withTimeAtStartOfDay();

获取字符串......

String string = startOfPreviousMonth; // or startOfPreviousMonth.toString();

转换回java.util.Date实例以与其他库通信...

java.util.Date date = startOfPreviousMonth.toDate();