小弟最近面试,觉得面试官:给一个日期串,在不使用calendar,不计算平闰年的状况下计算当月天数,怎么计算?java
当时小弟以为,这彻底是被帮助手脚被人啪啪啪的感受啊。。浑身不自在。后来讲面试
org.joda.time.DateTime
这个对象能够搞定。但面试官又问了。若是是本身实现呢?没回答出来。code
今天请教了一些大牛,给了一些思路。最后搞出来了。orm
思路:将日期串转换成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天,官网是这么解释的get
将该日期的日期设置为
*指定值。该对象被修改成
*表示在指定日期内的某一时间点。
*月、年、月、小时、分、秒相同。
*如之前在当地时区所解释的那样。若是日期
*是4月30日,例如,日期定为31,而后
*将被视为5月1日,由于四月只有
* 30天。
*
* @param日期当天的月值之间1-31。
*“看java.util.calendar
*“过期的JDK版本1.1,
* <代码>历取代。集(calendar.day_of_month,int日期)</代码>。io
最后附上DateTime的用法class