java比较时间
问题描述
String date1 = “2017-04-06”;String start = '2017-04';String end = '2017-06';java 计算data1是否在start和end之间。start和end即表示的是四月到六月
问题解答
回答1:如果你没用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');} }}回答2:
我看前面已经有人说到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转化为LocalDateLocalDate currentDate = LocalDate.parse(date);return currentDate.isAfter(startDate) && currentDate.isBefore(endDate); }
简单解释一下...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:
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 之间');} } }回答4:
如果你没用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; }}回答5:
end要转换成这个月的最后一天,比如说2017-06-30;
如果格式确定为yyyy-mm或yyyy-mm-dd,那么用date.compareTo(start) >= 0 && date.compareTo(end) < 0就可以了;
如果有不规范的格式,比如2017-4-6,要么转换成规范的格式,要么都转换成Date或long(Date本质就是long),再进行比较。
相关文章:
1. css - 使用blur()滤镜为什么有透明的效果2. android - 安卓做前端,PHP做后台服务器 有什么需要注意的?3. Android下,rxJava+retrofit 并发上传文件和串行上传文件的效率为什么差不多?4. python的bs4如何筛选出h1标签中的内容5. javascript - 移动端H5页面禁止缩放了,在浏览器上仍然可以缩放6. javascript - JS设置Video视频对象的currentTime时出现了问题,IE,Edge,火狐,都可以设置,反而chrom却...7. angular.js - 通过数据中children的个数自动生成能点击展开的div8. docker gitlab 如何git clone?9. java - spring-data Jpa 不需要执行save 语句,Set字段就可以自动执行保存的方法?求解10. docker-compose 为何找不到配置文件?
