java - 根据修订日期映射映射开始日期和结束日期

标签 java time jodatime

我的开始日期为:2014-09-20,结束日期为2014-09-23

我有一张 map ,其中包含类似的值

key(revision)    Value

  109         2014-06-17
  110         2014-09-23

我需要输出采用以下格式

Start date  End date    revision
2014-09-20  2014-09-22  109
2014-09-23  2014-09-23  110

我有以下代码,但如果提供的开始日期或结束日期相同,则会失败。 RevisionInfo 是包含 start_date(joda DateTime)、end_date(joda DateTime) 和 revision(Integer) 的 bean 类

public static void main(String[] args) {

    DateTime startDate = new DateTime("2014-09-20");
    DateTime endDate = new DateTime("2014-09-23");

   Map<Integer, DateTime> revisions = new HashMap<Integer, DateTime>();


    revisions.put(109, new DateTime("2014-06-17"));
    revisions.put(110, new DateTime("2014-09-23"));

    Map<Integer, DateTime> sortedRevisions = new TreeMap<Integer, DateTime>(revisions);

    DateTime nextRevisionStartDate  = startDate;
    Integer previousRevision  = null;

    List<RevisionInfo> revisionInfos = new ArrayList<RevisionInfo>();

    for (Integer revision : sortedRevisions.keySet()){

        if(sortedRevisions.get(revision).isAfter(endDate) ){
            break;
        }

        if(sortedRevisions.get(revision).isEqual(startDate) || sortedRevisions.get(revision).isAfter(startDate) ){

            if(revisionInfos.size() == 0)
            {
                if(previousRevision != null) {
                    revisionInfos.add(new RevisionInfo(startDate, sortedRevisions.get(revision).minusDays(1), previousRevision));
                    nextRevisionStartDate = sortedRevisions.get(revision);
                }
            }
            else
            {
                revisionInfos.add(new RevisionInfo(nextRevisionStartDate, sortedRevisions.get(revision).minusDays(1), previousRevision));
                nextRevisionStartDate = sortedRevisions.get(revision);
            }

        }

       previousRevision = revision;


    }


    revisionInfos.add(new RevisionInfo(nextRevisionStartDate, endDate, previousRevision));



    for (RevisionInfo revisionInfo : revisionInfos){

        System.out.println("Start Date :: "+ revisionInfo.getStartDate()+ ":: End date ::"+ revisionInfo.getEndDate()+": Revision:"+ revisionInfo.getRevision());
    }
}

失败案例

提供的输入日期为

Start_date   End_date
2014-09-23   2014-09-23

生成的输出

Start_date   End_date    Revision
2014-09-23   2014-09-22   110
2014-09-23   2014-09-23   110

预期输出为

Start_date   End_date    Revision
2014-09-23   2014-09-23   110

最佳答案

而不是

    if(sortedRevisions.get(revision).isEqual(startDate) || sortedRevisions.get(revision).isAfter(startDate) ){

你的条件应该只是:

    if(sortedRevisions.get(revision).isAfter(startDate) ){

说明:

在每一轮中,您都会查看当前版本,并决定是否将上一个版本添加到列表中。

如果当前修订的日期大于开始日期,则意味着先前的修订在实际开始日期仍然“有效”。例如,如果开始日期为 2014-10-05,并且当前修订版于 2014-10-10 开始,则表示从 2014-10-05 开始到 2014-10-09 之前的修订版仍然“有效”。

但是,如果当前修订版从实际开始日期开始(相等),则意味着之前的版本在该日期生效。目前的修订已于开始日期生效。由于此时您正在决定是否添加先前修订版,因此您拒绝了它。而当前的修订,很好,将在下一轮处理。

关于java - 根据修订日期映射映射开始日期和结束日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26895725/

相关文章:

c++ - 用于指令的 If 语句

java - 如何区分两个 JodaTime LocalTime 时间戳?

java - R8 : NullPointerException during IR Conversion

java - 从一个表中读取行并将其复制到Java中的另一个数据库表中

java - 将条件转换为分离条件

r - 计算从基准年 (t0) 到随后但有限的系列年 (t1, ..., tk) 的百分比变化

javascript - 如何在当前 UTC 而不是客户端本地时间上创建此 'time ago' 函数引用?

java - 有没有办法在java中创建一个范围?

java - 将 java.util.Date 转换为 org.joda.time.LocalDateTime 时出现问题

java - HashMap<DateTime, ArrayList<Email>>