当前位置: 首页 > 知识库问答 >
问题:

在列表中为连续的日期创建期间(它们之间相差一天)

谢烨烨
2023-03-14

我遇到了一个我不知道如何解决的问题。

我有一个包含日期的列表,代码如下:

public static void main(String[] args) {
    TreeSet<LocalDate> dates = getDaysBetween("2017-02-01","2017-03-31");
    dates.removeAll(getDaysBetween("2017-01-01","2017-02-01"));
    dates.removeAll(getDaysBetween("2017-03-01","2017-03-04"));
    dates.removeAll(getDaysBetween("2017-03-08","2017-03-08"));
    dates.removeAll(getDaysBetween("2017-03-10","2017-03-12"));
    dates.removeAll(getDaysBetween("2017-03-14","2017-03-16"));
    dates.removeAll(getDaysBetween("2017-03-19","2017-03-19"));
    dates.removeAll(getDaysBetween("2017-03-22","2017-03-22"));
}

public static TreeSet<LocalDate> getDaysBetween(String start, String end){
    DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    LocalDate startDate = LocalDate.parse(start, fmt);
    LocalDate endDate = LocalDate.parse(end, fmt);
    TreeSet<LocalDate> dates = new TreeSet<LocalDate>();
    LocalDate current = startDate;
    while (current.isBefore(endDate) || current.equals(endDate)) {
       dates.add(current);
       current = current.plusDays(1);
    }
    return dates;
 }

 class Period {
     private Date startDate;
     private Date endDate;
 }

开始日期和结束日期的标准是“日期是连续的(它们之间相差一天)”,当它们不连续时,另一个时期已经开始。

在main方法中,我创建了许多存储在列表中的日期,然后从列表中删除了一些日期。使用列表中左侧连续的日期(它们之间相差一天)创建一个期间,如果不连续,则另一个期间开始。

期间如下:

startDate: 2017-02-02, endDate: 2017-02-28
startDate: 2017-03-05, endDate: 2017-03-07
startDate: 2017-03-09, endDate: 2017-03-09
startDate: 2017-03-13, endDate: 2017-03-13
startDate: 2017-03-17, endDate: 2017-03-18
startDate: 2017-03-20, endDate: 2017-03-21
startDate: 2017-03-23, endDate: 2017-03-31

我想创建一个算法来根据提供的日期列表创建这些周期对象

我为此受阻已久。到目前为止,我还没有为这个案子想出一个好的解决办法。

共有1个答案

韩博简
2023-03-14

我假设开始日期和结束日期的标准是“日期是连续的(它们之间相差一天)”,如果它们不是连续的,那么另一个时期已经开始了。根据您的输入,我还假设日期列表已经排序。

首先,您可以将您的代码更改为使用java.timeAPI,而不是旧的java.util.Date。如果您使用Java7或以下版本,请使用具有相同类和功能的三回口。

所以首先要确定你是否在乎时间。在你的输入中,所有时间都是午夜。如果这没有关系,可以使用LocalDate,这是一个只关心日、月和年的类。

我假设必须保留一天中的时间,所以我使用了一个LocalDateTime(一个具有日期和时间的类,因此它完全匹配您的输入):

class Period {
    private LocalDateTime startDate;
    private LocalDateTime endDate;

    // constructor, getters and setters
}

现在我们必须循环遍历列表,并将这些字符串转换为LocalDateTime。这可以使用DateTimeFormatter完成。然后我们比较这些日期,看看它们是否是连续的——使用标准“它们之间的差异是一天或更多”——我使用ChronoUnit类来计算差异。

我使用这个日期列表:

String[] datesList = new String[] {
    "2018-03-01 00:00:00",
    "2018-03-02 00:00:00",
    "2018-03-03 00:00:00",
    "2018-03-04 00:00:00",
    "2018-03-10 00:00:00",
    "2018-03-11 00:00:00",
    "2018-03-12 00:00:00",
    "2018-03-14 00:00:00",
    "2018-03-15 00:00:00",
    "2018-03-16 00:00:00",
    "2018-03-18 00:00:00" };

算法是这样的:

List<Period> periodList = new ArrayList<>();
Period p = null;
LocalDateTime prev = null;
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
for (String s : datesList) {
    if (prev == null) { // starting new period 
        prev = LocalDateTime.parse(s, fmt);
        p = new Period();
        p.setStartDate(prev);
    } else { // in the middle of a period
        LocalDateTime date = LocalDateTime.parse(s, fmt);
        // check the difference in days
        // convert to LocalDate to ignore hours in the comparison
        if (ChronoUnit.DAYS.between(prev.toLocalDate(), date.toLocalDate()) > 1) {
            // difference is more than 1 day, period ended
            p.setEndDate(prev);
            periodList.add(p);

            // start new period
            p = new Period();
            p.setStartDate(date);
            prev = date;
        } else {
            prev = date;
        }
    }
}
// check last period
if (p != null && p.getEndDate() == null) {
    p.setEndDate(p.getStartDate());
    periodList.add(p);
}

因为我假设了很多事情,你必须根据你的标准来调整。

如果您仍然需要使用java。util。日期,您可以将其转换为:convert java。时间将LocalDate转换为java。util。日期类型

 类似资料:
  • 我试图使用PHP Carbon库填充提供的开始日期和结束日期之间的日期数组。如果日期没有特定的顺序,这将是直截了当的... 以下是场景: 我需要用每周四天填充dates数组。例如,这些日期的顺序必须如此,星期二是开始日期的第二天: 星期二、星期四、星期六、星期天,所以我需要一种方法来获取开始日期,并在迭代到下一周之前添加2天、2天、1天。 使用碳(碳周期/碳间隔)可以做到这一点吗? 或者我的解决方

  • 问题内容: 如何找到两个日期之间的差异? 问题答案: 通过使用Date对象及其毫秒值,可以计算出差异: 您可以通过将毫秒除以1000来将秒转换为秒,然后将结果转换为整数来获得秒数(作为整数/整数):(除去代表毫秒的小数部分): 然后可以通过除以60并将其转换为整数,然后除以60并将其转换为整数,然后以相同的方式获得更长的时间单位来获得整数。由此,可以创建一个功能,以时间单位的最大值获得一个较低的单

  • 问题内容: 如何查询SQL Server的SQL Server 2005表列的创建日期? 我尝试获取该信息,但是创建日期未包含在此存储过程中。 如何才能做到这一点? 问题答案: 有一个名为sys.Columns的系统表,您可以从中获取列信息。如果要查看特定表的列,可以执行以下操作: 或者,您可以获取如下表信息: 但是我找不到有关列创建日期的任何信息。 更新: 这可能会有所帮助。

  • 问题内容: 我必须找到java中两个不同日期对象之间的时间差异,如果该时间超过5秒,我必须使会话无效。 这是场景: 我有一个jsp页面,它每5秒设置一次会话 我还有另一个jsp页面,每1秒访问一次, 现在,我必须在我提到的另一个jsp中进行比较,并使会话无效, 因此,如果差异超过5秒,则会话无效。 问题答案:

  • 问题内容: 使用标准的mysql函数可以编写查询,该查询将返回两个日期之间的天数列表。 例如,给定2009-01-01和2009-01-13,它将返回一个具有以下值的列表: 编辑:看来我还不清楚。我要生成此列表。我在数据库中存储了值(按日期时间),但希望将它们在左外部联接中汇总到上述日期列表中(我希望这种联接的某些右侧在几天内会为null并将对此进行处理) )。 问题答案: 我将使用此存储过程将所

  • 我试图在两天之间创建一个天数列表。 我创建了如下解决方案: 但它只在90%的情况下有效(如果有月变化,它就不起作用) 例如,当我选择日期时: 从8月29日到9月30日,从8月31日,它给我打印了几天 有没有办法解决我的问题,或者有更好的办法? 编辑: 我的问题和建议的问题不同,因为在我的问题中,我有两个日期作为输入 例如 在建议的重复结果,这可能是int号 我的问题是如何循环两个日期之间的所有日期