我正在尝试获取上个月第一天的日期和时间;特别是因为它是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
答案 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();