我现在有个List,student实体里面有个createTime字段,如何根据createTime字段筛选出今天、近7天的数据。
不用sql,只能用java!
LocalDateTime 和 date 都可以照着改
public List<Student> test(List<Student> studentList) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DATE, -7);
return studentList.stream().filter(student -> student.createTime.after(calendar.getTime())).collect(Collectors.toList());
}
粗略的写一下吧,你自己再剔除不需要的部分
static class Student{
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
List<Student> studentList = new ArrayList<>();
Student student1 = new Student();
student1.setDate(new Date());
Student student2 = new Student();
student2.setDate(simpleDateFormat.parse("2022-07-15 10:00:00"));
studentList.add(student1);
studentList.add(student2);
List<Student> todayList = studentList.stream().filter(item -> {
Date date = new Date();
String today = simpleDateFormat.format(date).split(" ")[0];
String todayStart = today + " 00:00:00";
String todayEnd = today + " 23:59:59";
try {
Date todayStartDate = simpleDateFormat.parse(todayStart);
Date todayEndDate = simpleDateFormat.parse(todayEnd);
return item.getDate().after(todayStartDate) && item.getDate().before(todayEndDate);
} catch (ParseException e) {
e.printStackTrace();
return false;
}
}).collect(Collectors.toList());
List<Student> sevenDayList = studentList.stream().filter(item -> {
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DATE, 1);
date = calendar.getTime();
String todayEnd = simpleDateFormat.format(date).split(" ")[0] + " 00:00:00";
calendar.add(Calendar.DATE, -8);
date = calendar.getTime();
String sevenDaysAgoEnd = simpleDateFormat.format(date).split(" ")[0] + " 00:00:00";
try {
Date sevenDaysAgoEndDate = simpleDateFormat.parse(sevenDaysAgoEnd);
Date todayEndDate = simpleDateFormat.parse(todayEnd);
return item.getDate().after(sevenDaysAgoEndDate) && item.getDate().before(todayEndDate);
} catch (ParseException e) {
e.printStackTrace();
return false;
}
}).collect(Collectors.toList());
@Test
public void test01(){
Test01 test01 = new Test01();
test01.setId(1L);
test01.setCreateTime(DateUtil.parse("2022-07-25"));
Test01 test02 = new Test01();
test02.setId(2L);
test02.setCreateTime(DateUtil.parse("2022-07-30"));
Test01 test03 = new Test01();
test03.setId(3L);
test03.setCreateTime(DateUtil.parse("2022-07-18"));
List<Test01> test01List = new ArrayList<>();
test01List.add(test01);
test01List.add(test02);
test01List.add(test03);
List<Test01> list = test01List.stream().filter(e ->
DateUtil.between(e.getCreateTime(), new Date(), DateUnit.DAY) <= 7).collect(Collectors.toList());
System.out.println(list);
}
public class Test01{
private Long id;
private Date createTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Override
public String toString() {
return "Test01{" +
"id=" + id +
", createTime=" + createTime +
'}';
}
}
这是用java8的stream和hutool的日期工具类筛选的,日期工具类不用hutool需要自己实现
records.stream().filter(item-> dayDiff(new Date(),item.getCreateTime()) > 7 && item.getCreateTime().before(new Date())).collect(Collectors.toList());
/**
* a
* 计算两个日期相差的天数,如果date2 > date1 返回正数,否则返回负数
*/
public static long dayDiff(Date date1, Date date2) {
return (date2.getTime() - date1.getTime()) / 86400000;
}
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
public class T {
public static void main(String[] args) throws ParseException {
List<Student> list = new ArrayList<>();
SimpleDateFormat dft = new SimpleDateFormat("yyyy-MM-dd");
Date beginDate = new Date();
Calendar date = Calendar.getInstance();
for (int i = 1; i < 10; i++) {
date.setTime(beginDate);
Student s = new Student();
date.set(Calendar.DATE, date.get(Calendar.DATE) - i);
Date endDate = dft.parse(dft.format(date.getTime()));
s.setCreateTime(endDate);
list.add(s);
}
date.setTime(beginDate);
date.set(Calendar.DATE, date.get(Calendar.DATE) - 7);
Date endDate = dft.parse(dft.format(date.getTime()));
List<Student> students = list.stream().filter(student -> !(student.getCreateTime().after(beginDate)) &&
!(student.getCreateTime().before(endDate))).collect(Collectors.toList());
}
static class Student {
private Date createTime;
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
}
package com.valley.jdk.date;
import lombok.Data;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* @author valley
* @date 2022/7/18
* @Description TODO
*/
public class Demo {
public static void main(String[] args) throws ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
List<Student> studentList = new ArrayList<>();
Student student1 = new Student();
student1.setDate(new Date());
Student student2 = new Student();
student2.setDate(simpleDateFormat.parse("2022-07-15 10:00:00"));
studentList.add(student1);
studentList.add(student2);
List<Student> todayList =new ArrayList<>();
List<Student> sevenDayList =new ArrayList<>();
Date date = new Date();
String today = simpleDateFormat.format(date).split(" ")[0];
String todayStart = today + " 00:00:00";
String todayEnd = today + " 23:59:59";
Date todayStartDate = simpleDateFormat.parse(todayStart);
Date todayEndDate = simpleDateFormat.parse(todayEnd);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DATE, 1);
String todayEnd2 = simpleDateFormat.format(calendar.getTime()).split(" ")[0] + " 00:00:00";
calendar.add(Calendar.DATE, -8);
String sevenDaysAgoEnd = simpleDateFormat.format(calendar.getTime()).split(" ")[0] + " 00:00:00";
Date sevenDaysAgoEndDate = simpleDateFormat.parse(sevenDaysAgoEnd);
Date todayEndDate2 = simpleDateFormat.parse(todayEnd2);
for(Student student:studentList){
Date dat=student.getDate();
if(dat.after(todayStartDate) && dat.before(todayEndDate)){
todayList.add(student);
}else if(dat.after(sevenDaysAgoEndDate) && dat.before(todayEndDate2)){
sevenDayList.add(student);
}
}
}
}
@Data
class Student{
private Date date;
}
使用Java的lamda表达式。
如果是Springboot项目,可以结合mybatis-plus这个ORM框架,轻松实现数据查询功能。
遍历判断创建时间是否为近七天,如果是则记录到近七天list并且判断是否今天,如果是则同步记录到今天List。
完整代码如下:
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
Student s1 = new Student();
// 今天
s1.setCreateTime(LocalDateTime.now());
Student s2 = new Student();
// 昨天
s2.setCreateTime(LocalDateTime.now().minusDays(1));
list.add(s1);
list.add(s2);
// 今天的数据
LocalDateTime todayBegin = LocalDate.now().atStartOfDay();
LocalDateTime todayEnd = LocalDate.now().atStartOfDay().plusDays(1).minusNanos(1);
List<Student> todayList = list.stream().filter(s -> s.getCreateTime().isBefore(todayEnd) && s.getCreateTime().isAfter(todayBegin)).collect(Collectors.toList());
System.out.println(todayList);
// 近7天的数据
LocalDateTime day7Begin = LocalDate.now().minusDays(6).atStartOfDay();
LocalDateTime day7End = LocalDate.now().atStartOfDay().plusDays(1).minusNanos(1);
List<Student> day7List = list.stream().filter(s -> s.getCreateTime().isBefore(day7End) && s.getCreateTime().isAfter(day7Begin)).collect(Collectors.toList());
System.out.println(day7List);
}
public static class Student {
/**对应数据库的日期字段*/
private LocalDateTime createTime;
public LocalDateTime getCreateTime() {
return createTime;
}
public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}
@Override
public String toString() {
return createTime.toString();
}
}
运行结果如下:
Connected to the target VM, address: '127.0.0.1:38188', transport: 'socket'
[2022-07-19T08:38:54.452170600]
[2022-07-19T08:38:54.452170600, 2022-07-18T08:38:54.452170600]
Disconnected from the target VM, address: '127.0.0.1:38188', transport: 'socket'
演示的代码中,有一条当天的数据,一条昨天的数据,
演示的结果,当天数据打印了一条,近7天的数据打印了2条
如有帮助,请采纳,十分感谢!
一种比较简单的方法是使用 for循环遍历列表并使用条件语句对其进行过滤,这种方法创建了一个单独的List,用于存储过滤选中的元素。如下所示。
List<String> dataList= Arrays.asList("123","123222","2323","6767");
List<String> resultList = new ArrayList<>();
for (String entry: dataList)
{
if (entry.startsWith("12")) {
resultList.add(entry);
}
}
System.out.println(resultList);
我们还可以使用迭代器过滤,这种方式不需要再次创建一个List。
下面的代码使用Iterator类提供的remove()方法来过滤列表元素。需要注意的是,如果使用 List的remove() 方法,则会抛出ConcurrentModificationException错误,因为在List中遍历时,是不允许动态删除列表中的元素的。
List<String> dataList = new ArrayList<>(Arrays.asList("123","123222","2323","6767"));
Iterator<String> iterator= dataList.iterator();
while (iterator.hasNext())
{
String temp = iterator.next();
if (!temp.startsWith("12")) {
iterator.remove();
}
}
System.out.println(dataList);
1.这个问题,主要就是时间类型如何进行比较,利用StreamAPI中的filter()过滤即可.
/**
* 我现在有个List,student实体里面有个createTime字段,如何根据createTime字段筛选出今天、近7天的数据。
*/
@Test
public void testDemo() {
// 创建一些学生数据
Stu stu1 = new Stu(1, "张三", LocalDateTime.now());
Stu stu2 = new Stu(2, "李四", LocalDateTime.now().minusDays(1L));
Stu stu3 = new Stu(3, "王五", LocalDateTime.now().minusDays(2L));
Stu stu4 = new Stu(3, "钱六", LocalDateTime.now().minusDays(10L));
List<Stu> stuList = Arrays.asList(stu1, stu2, stu3, stu4);
// 获取今天的数据
List<Stu> collect = stuList.stream().filter(e -> e.getCreateTime().compareTo(LocalDateTime.now()) == 0).collect(
Collectors.toList());
// 结果输出
System.out.println("今天刚创建的用户是:" + collect);
System.out.println("----------------------------------------------------------------------------");
// 设置时间范围 例如今天2022/7/19,那么过去7天的范围应是: 2022-07-11 00:00:00 ~ 2022-07-18 23:59:59
LocalDateTime startTime = LocalDateTime.now().minusDays(1L).withHour(23).withMinute(59).withSecond(59);
LocalDateTime endTime = LocalDateTime.now().minusDays(8L).withHour(0).withMinute(0).withSecond(0);
// 获取过去7天的结果 -> 逻辑推导出 endTime<= createTime <= startTime
// a.compareTo(b) 如果,a>b 返回1;如果a=b,返回0;如果a<b,返回-1
List<Stu> collect1 = stuList.stream().filter(
e -> startTime.compareTo(e.getCreateTime()) >= 0 && endTime.compareTo(e.getCreateTime()) <= 0).collect(
Collectors.toList());
System.out.println("过去七天的用户是:" + collect1);
}
遍历List,拿到createTime的值,然后进行时间比较呃,so easy
用java8,转成stream来筛选,很好操作的
最笨的办法 for循环遍历整个数组 每个对象都取出时间来判断 今天、近七天 符合就加到另一个数组里
用stream流方便