String date1 = “2017-04-06”;String start = "2017-04";String end = "2017-06";java 計算data1是否在start和end之間。start和end即表示的是四月到六月
小伙看你根骨奇佳,潜力无限,来学PHP伐。
如果你沒用Java8:
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Main { public static void main(String[] args) throws ParseException { String date1 = "2017-06-06"; String start = "2017-04"; String end = "2017-06"; Date d1 = new SimpleDateFormat("yyyy-MM-dd").parse(date1); Date dStart = new SimpleDateFormat("yyyy-MM").parse(start); Calendar c = Calendar.getInstance(); c.setTime(new SimpleDateFormat("yyyy-MM").parse(end)); c.add(Calendar.MONTH, 1); Date dEnd = c.getTime(); if (d1.after(dStart) && d1.before(dEnd)) { System.out.println("true"); } else { System.out.println("false"); } } }
我看前面已經有人說到Java8了...不過這個寫法是有點尷尬...思路大家基本上一樣...
給的start時間要變成當前月的第一天
給的end時間要變成當前月的最後一天
關鍵是如何變的問題...Java8的時間是有現成的API可以調用的...不需要parse這種方式...變成第一天還好,變成最後一天有諸多的判斷. ..
程式碼如下,依照所給條件,寫了一個isBetween方法
public static boolean isBetween(String date, String start, String end){ // 把start转化为start所在月份的第一天 LocalDate startDate = LocalDate.now().with(YearMonth.parse(start)).with(TemporalAdjusters.firstDayOfMonth()); // 把end转化为end所在月份的最后一天 LocalDate endDate = LocalDate.now().with(YearMonth.parse(end)).with(TemporalAdjusters.lastDayOfMonth()); // 把date转化为LocalDate LocalDate currentDate = LocalDate.parse(date); return currentDate.isAfter(startDate) && currentDate.isBefore(endDate); }
簡單解釋一下...yyyy-mm這種年月的形式在Java8中已經有新的類別來處理,這就是YearMonth(它是一个TemporalAdjuster的实现类),根据LocalDate(它是一个Temporal的实现类)的with方法,其实是Temporal介面的with方法,這裡涉及到Java8的新時間API的設計,with方法簽名如下
YearMonth
TemporalAdjuster
LocalDate
Temporal
意義即是:一個Temporal对象可以根据一个TemporalAdjuster物件進行調整
所以結合到上面寫的程式碼,思路如下
隨意取了當前時間LocalDate A
把A依照傳入的YearMonth進行修改(呼叫with方法),即調整時間的年和月,得到時間B
把B再根據一個調整器TemporalAdjuster(TemporalAdjusters.firstDayOfMonth),調整時間的日,得到最後的時間
TemporalAdjusters.firstDayOfMonth
其實時間調整,在TemporalAdjusters中已經封裝了不少常用的了...用起來也簡單直白好用的,可以關注這個類
TemporalAdjusters
最後,提供一個我以前自己簡單連的Java8新時間API的一些關係,跟著這些關係可以再看看具體類,捋捋關係,會發現新時間API不但好用還很強大
如果你用了 Java8:
import java.time.LocalDate; public class What { public static void main(String[] args) throws Exception { String date1 = "2017-04-06"; String start = "2017-04"; String end = "2017-06"; LocalDate date = LocalDate.parse(date1); LocalDate startDate = LocalDate.parse(start + "-01"); LocalDate endDate = LocalDate.parse(end + "-01"); endDate = endDate.plusDays(endDate.getMonth().maxLength()); if (date.isAfter(startDate) && date.isBefore(endDate)) { System.out.println("data1 在 start 和 end 之间"); } else { System.out.println("data1 不在 start 和 end 之间"); } } }
如果你沒用Java8但用了Joda-time:
public boolean between(String date){ String start = "2017-04"; String end = "2017-06"; try { return DateTime.parse(date).isAfter(DateTime.parse(start).withDayOfMonth(1).toInstant()) && DateTime.parse(date).isBefore(DateTime.parse(end).plusMonths(1).withDayOfMonth(1).minusDays(1).toInstant()); }catch (Exception e){ return false; } }
end要轉換成這個月的最後一天,比如說2017-06-30;
2017-06-30
如果格式確定為yyyy-mm或yyyy-mm-dd,那么用date.compareTo(start) >= 0 && date.compareTo(end) < 0就可以了;
yyyy-mm
yyyy-mm-dd
date.compareTo(start) >= 0 && date.compareTo(end) < 0
如果有不規範的格式,例如2017-4-6,要嘛轉換成規範的格式,要嘛都轉換成Date或long(Date本質就是long),再進行比較。
2017-4-6
如果你沒用Java8:
我看前面已經有人說到Java8了...不過這個寫法是有點尷尬...思路大家基本上一樣...
給的start時間要變成當前月的第一天
給的end時間要變成當前月的最後一天
關鍵是如何變的問題...Java8的時間是有現成的API可以調用的...不需要parse這種方式...變成第一天還好,變成最後一天有諸多的判斷. ..
程式碼如下,依照所給條件,寫了一個isBetween方法
簡單解釋一下...
yyyy-mm這種年月的形式在Java8中已經有新的類別來處理,這就是
YearMonth
(它是一个TemporalAdjuster
的实现类),根据LocalDate
(它是一个Temporal
的实现类)的with方法,其实是Temporal
介面的with方法,這裡涉及到Java8的新時間API的設計,with方法簽名如下意義即是:一個
Temporal
对象可以根据一个TemporalAdjuster
物件進行調整所以結合到上面寫的程式碼,思路如下
隨意取了當前時間
LocalDate
A把A依照傳入的
YearMonth
進行修改(呼叫with方法),即調整時間的年和月,得到時間B把B再根據一個調整器
TemporalAdjuster
(TemporalAdjusters.firstDayOfMonth
),調整時間的日,得到最後的時間其實時間調整,在
TemporalAdjusters
中已經封裝了不少常用的了...用起來也簡單直白好用的,可以關注這個類最後,提供一個我以前自己簡單連的Java8新時間API的一些關係,跟著這些關係可以再看看具體類,捋捋關係,會發現新時間API不但好用還很強大
如果你用了 Java8:
如果你沒用Java8但用了Joda-time:
end要轉換成這個月的最後一天,比如說
2017-06-30
;如果格式確定為
yyyy-mm
或yyyy-mm-dd
,那么用date.compareTo(start) >= 0 && date.compareTo(end) < 0
就可以了;如果有不規範的格式,例如
2017-4-6
,要嘛轉換成規範的格式,要嘛都轉換成Date或long(Date本質就是long),再進行比較。