【问题标题】:How to find Employee with the latest Joining Date in this case在这种情况下如何查找入职日期最新的员工
【发布时间】:2020-08-25 15:20:27
【问题描述】:

我有员工名单,我正在尝试查找最新加入日期的Employee。这就是我目前所实施的。

员工:

package com;

public class Employee {
    private String accountNumber;
    private String joiningdate;

    public Employee(String accountNumber, String joiningdate) {
        super();
        this.accountNumber = accountNumber;
        this.joiningdate = joiningdate;
    }

    // setters and getters
}

应用:

package com;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class LatestDueDate {

    public static void main(String[] args) throws Exception {
        try {
            SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");

            List < Employee > empList = new ArrayList < > ();

            empList.add(new Employee("1234", "07/11/2020"));
            empList.add(new Employee("1234", "06/12/2020"));

            Employee emp = empList.stream().max(Comparator.comparing(Employee::getJoiningdate)).get();
        } catch (Exception e) {

        }
    }
}

我知道我需要将字符串日期格式转换为日期。

【问题讨论】:

  • 您没有解释您的代码有任何问题。比如说,一个特定的输入不能像你期望的那样工作
  • 如果你在 catch 块中添加e.printStacktrace()而不是吃掉异常,它不会伤害任何人。
  • 不要使用SimpleDateFormatDate。它们已经过时了。请改用java.time 中的类。
  • @MCEmperor 所说的。并且不要将您的加入日期表示为对象中的字符串。将其表示为LocalDate(就像您不将数字和布尔值表示为字符串一样——我希望如此)。

标签: java date compare


【解决方案1】:

您可以将字符串日期转换为LocalDate 并在比较器内部进行比较。但我建议您在 Employee 类中使用 LocalDate 代替 joiningdate,这样您就不需要将比较器中的日期字符串解析为最新的加入日期。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
Employee emp = empList.stream()
    .max(Comparator.comparing(e -> LocalDate.parse(e.getJoiningdate(), formatter)))
    .get();

注意:不要使用旧的Date 类,而是使用LocalDatejava.time

【讨论】:

    【解决方案2】:

    您正在按员工的入职日期排序,但问题是您的 Java 类使用 text 字符串表示此日期,而不是真正的 java.util.Date 或等效的 Java 8 类。如果您必须坚持使用文本日期,那么您至少应该以 ISO 格式表示它们,例如

    List<Employee> empList = new ArrayList<>();
    
    empList.add(new Employee("1234", "2020/11/07"));
    empList.add(new Employee("1234", "2020/12/06"));
    
    Employee emp = empList.stream().max(Comparator.comparing(Employee::getJoiningdate)).get();
    System.out.println("Latest employee joined on: " + emp.getJoiningDate());
    

    上述方法有效,因为文本日期2020/12/06 将排在2020/11/07 之后。更好的方法可能是使用适当的日期类型表示加入日期,或者在对员工进行排序之前至少将文本日期转换为实际日期类型。

    【讨论】:

    • 您没有在任何地方使用该格式,因此您提供的代码在功能上与问题中的代码相同
    • @Michael ...您对我的回答的理解为零。如果你运行它,你会发现它确实工作,因为现在我们正在对符合 ISO 标准的日期文字进行排序,这些日期文字可以正确排序(而 OP 的原始日期字符串没有)。
    • 那不是ISO-compliant。斜线表示间隔。
    猜你喜欢
    • 2020-09-03
    • 2021-11-17
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2012-10-11
    相关资源
    最近更新 更多