首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >验证项目在开始日期和结束日期范围内

验证项目在开始日期和结束日期范围内
EN

Stack Overflow用户
提问于 2014-09-09 09:19:19
回答 4查看 3.8K关注 0票数 0

我有一个java程序,将检查每个项目的开始日期和结束日期。每个项目都必须有自己特定的开始日期和结束日期范围。如果新的开始日期和结束日期的范围在较早的开始日期和结束日期范围内,则系统会提示错误消息。例如:

代码语言:javascript
运行
复制
 Company: ABC
 Item_Number     Start Date      End Date
 Item 11A        01/08/2014      01/09/2014  
 Item 11B        02/09/2014      30/09/2014
 Item 11C        18/08/2014      30/08/2014

当最终用户尝试添加项目11C时,系统将提示错误消息。有什么建议来解决这个问题吗?非常感谢。

EN

回答 4

Stack Overflow用户

发布于 2014-09-09 09:26:31

你可以这样做:

代码语言:javascript
运行
复制
public class DateDemo {

    public static void main(String[] args) {

        Date date = new Date(11, 5, 21);
        Date date2 = new Date(15, 1, 21);

        // tests if date2 is before date and prints result
        boolean before = date2.before(date);
        if (before) {
            System.out.println("Date 2 is before date: " + before);
            throw new RuntimeException("Error with dates");
        }

    }
}

当然,这只是一个例子,因为我不知道这个日期是从哪里来的。你必须在一个循环中验证它们。

票数 1
EN

Stack Overflow用户

发布于 2014-09-09 09:50:11

日期范围可能很棘手...

首先,您需要确保原始开始日期不等于比较开始日期或比较结束日期,并且原始结束日期不等于比较开始日期或比较结束日期

代码语言:javascript
运行
复制
startDate.equals(originalStartDate) ||
startDate.equals(originalEndDate) ||
endDate.equals(originalStartDate) ||
endDate.equals(originalEndDate)

如果一切正常(false),则需要检查比较开始日期是否在原始开始日期或结束日期之间,以及比较结束日期是否在原始开始日期或结束日期之间……

代码语言:javascript
运行
复制
(startDate.after(originalStartDate) || startDate.before(originalEndDate) ||
(endDate.after(originalStartDate) || endDate.before(originalEndDate)

这将尝试捕获两个范围包含或相互重叠的任何点...

因为我实际写了一些测试代码。

代码语言:javascript
运行
复制
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class CompareDates {

    public static void main(String[] args) {
        try {
            List<Event> events = new ArrayList<Event>(3);
            events.add(new Event(toDate("01/08/2014"), toDate("01/09/2014")));
            events.add(new Event(toDate("02/09/2014"), toDate("30/09/2014")));

            Date start = toDate("18/08/2014");
            Date end = toDate("30/08/2014");

            for (Event evt : events) {
                System.out.println(evt.conflicts(start, end));
            }

        } catch (ParseException exp) {
            exp.printStackTrace();
        }
    }

    public static Date toDate(String value) throws ParseException {
        return new SimpleDateFormat("dd/MM/yyyy").parse(value);
    }

    public static class Event {
        private Date startDate;
        private Date endDate;

        public Event(Date startDate, Date endDate) {
            this.startDate = startDate;
            this.endDate = endDate;
        }

        public boolean conflicts(Date start, Date end) {

            return start.equals(startDate) ||
                            start.equals(endDate) ||
                            end.equals(startDate) ||
                            end.equals(endDate) ||
                            (start.after(startDate) && start.before(endDate)) || 
                            (end.after(startDate) && end.before(endDate));

        }

    }

}
票数 1
EN

Stack Overflow用户

发布于 2014-09-09 10:16:38

下面是一个使用Joda-TimeGuava's Range的可能实现的简单单元测试。

代码语言:javascript
运行
复制
  import com.google.common.collect.Lists;
  import com.google.common.collect.Range;
  import org.joda.time.LocalDate;
  import org.junit.Test;
  import java.util.List;
  import static org.junit.Assert.assertEquals;

  public class ItemDateRangeTest {

    static class Item {
      private final String id;
      private final LocalDate startDate;
      private final LocalDate endDate;

      public Item(String id, LocalDate startDate, LocalDate endDate) {
        this.id = id;
        this.startDate = startDate;
        this.endDate = endDate;
      }

      public String getId() {
        return id;
      }

      public LocalDate getStartDate() {
        return startDate;
      }

      public LocalDate getEndDate() {
        return endDate;
      }

      public Range<LocalDate> getRange() {
        // Closed range includes the lower and upper bounds
        return Range.closed(startDate, endDate);
      }
    }


    static class ItemStore {
      private final List<Item> items = Lists.newArrayList();

      public void add(Item newItem) throws IllegalArgumentException{
        for (Item item : items) {
            if (item.getRange().isConnected(newItem.getRange())) {
              throw new IllegalArgumentException("error: date range overlap!");
            }
        }
        items.add(newItem);
      }
      public List<Item> getItems() {
        return items;
      }
    }

    @Test()
    public void testItemDateRangeNoOverlap() {
      final ItemStore itemStore = new ItemStore();
      Item itemA = new Item("11A", new LocalDate(2014, 8, 1), new LocalDate(2014, 9, 1));
      Item itemB = new Item("11B", new LocalDate(2014, 9, 2), new LocalDate(2014, 9, 30));
      itemStore.add(itemA);
      itemStore.add(itemB);
      assertEquals(itemStore.getItems().get(0), itemA);
      assertEquals(itemStore.getItems().get(1), itemB);
    }

    @Test(expected = IllegalArgumentException.class)
    public void testItemDateRangeWithOverlap() {
      final ItemStore itemStore = new ItemStore();
      itemStore.add(new Item("11A", new LocalDate(2014,8,1), new LocalDate(2014,9,1)));
      itemStore.add(new Item("11B", new LocalDate(2014,9,2), new LocalDate(2014,9,30)));
      itemStore.add(new Item("11C", new LocalDate(2014,8,18), new LocalDate(2014,8,30)));
    }
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25735407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档