小弟最近面试,以为面试官:给一个日期串,在不使用calendar,不计算平闰年的情况下计算当月天数,怎么计算?
当时小弟觉得,这完全是被帮助手脚被人啪啪啪的感觉啊。。浑身不自在。后来说
org.joda.time.DateTime
这个对象可以搞定。但面试官又问了。如果是自己实现呢?没回答出来。
今天请教了一些大牛,给了一些思路。最后搞出来了。
思路:将日期串转换成date对象,然后获取到下个月的第一天,再减1天,得到当前月的最后1天,最后在获取这一天就行了
package com.wisely;
import org.joda.time.DateTime;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* DES: 计算当月的天数,不用calendar 不计算平闰年
* Created by Reynole-白
* Date: 2017/8/30 10:06
*/
public class TestDate {
public static void main(String[] args) throws Exception {
String dateStr = "2017-08-30";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date dd = sdf.parse(dateStr);
//date对象计算月份从0开始,如果+1 代表下个月
int month = dd.getMonth() + 1;
//获取到下个月的月份
dd.setMonth(month);
//下个月的首日
dd.setDate(1);
//下个月的首日-1 的到当前月的最后1天 也就是当前月的天数
dd.setDate(dd.getDate()-1);
System.out.println("当前月的天数:" + dd.getDate());
//-------------------------------------------------------------------------------
//使用joda-time 操作
DateTime dateTime = new DateTime(dateStr);
System.out.println("获取当前月的天数:"+dateTime.dayOfMonth().getMaximumValue());
}
}
我发现使用date的setDate(0)后,能将date对象变成上个月的最后1天,官网是这么解释的
将该日期的日期设置为
*指定值。该对象被修改为
*表示在指定日期内的某一时间点。
*月、年、月、小时、分、秒相同。
*如以前在当地时区所解释的那样。如果日期
*是4月30日,例如,日期定为31,然后
*将被视为5月1日,因为四月只有
* 30天。
*
* @param日期当天的月值之间1-31。
*“看java.util.calendar
*“过时的JDK版本1.1,
* <代码>历取代。集(calendar.day_of_month,int日期)</代码>。
最后附上DateTime的用法