小弟最近面試,覺得面試官:給一個日期串,在不使用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