2010-05-01 60 views
6

Tôi muốn tính ngày kết thúc (và thời gian) của một sự kiện. Tôi biết ngày bắt đầuthời lượng (tính bằng phút). Nhưng:Tính ngày kết thúc trong khi bỏ qua ngày lễ + thời gian Joda

  1. tôi phải bỏ qua ngày lễ - tình trạng không tái phát
  2. tôi phải bỏ qua cuối tuần - tình trạng tái phát
  3. tôi phải không thời gian làm việc đếm (ví dụ: từ 8:00 giờ sáng đến 5 : 00pm) - tình huống thường xuyên, nhưng với độ chi tiết mịn hơn

Có cách nào đơn giản để đạt được những trường hợp này bằng thư viện thời gian Joda không?

Trả lời

2

Jodatime sẽ giúp bạn - nhiều điều tôi muốn nói-, nhưng bạn sẽ cần phải viết logic cho mình, một vòng lặp bỏ qua một số ngày và một số lần trong ngày. Không phải rất đơn giản, không phức tạp lắm, có vẻ như với tôi.

+0

Đánh dấu là câu trả lời được chấp nhận, bởi vì đó là sự thật. Theo các nghiên cứu của tôi, không có giải pháp đơn giản. Và Jodatime chắc chắn hữu ích. – picca

1

Trước tiên, bạn phải xác định "ngày lễ". Không phải mọi miền địa phương đều có cùng một ngôn ngữ, vì vậy điều này phải được thực hiện chung chung và có thể cắm được.

Tôi không nghĩ đó là "đơn giản".

+0

Trong trường hợp ngày nghỉ của tôi được lưu trữ trong cơ sở dữ liệu. Nhưng tôi muốn chỉ ra rằng tôi không thể sử dụng: if (dayofweek() == 7) {skip(); } – picca

1

Bạn đã xem dự án Holiday calculation chưa? nó là đặc trưng trong các dự án liên quan từ jodatime và có thể hữu ích

+0

Trông rất tốt. Nhưng tôi vẫn không biết cách xử lý giờ làm việc. Tôi về cơ bản cần phải nhanh chóng chuyển tiếp ngày được đưa ra bởi N-phút. Bỏ qua giờ làm việc, ngày lễ, v.v ... – picca

0

Đây là một số mã tôi sử dụng. dtDateTimes có thể chứa các ngày nghỉ được xác định trước của bạn (ví dụ: Ngày lễ Ngân hàng Vương quốc Anh) và dtConstants có thể chứa những thứ định kỳ bạn muốn đối sánh, như DateTimeConstants.SATURDAY.

/** 
* Returns a tick for each of 
* the dates as represented by the <code>dtConstants</code> or the list of <code>dtDateTimes</code> 
* occurring in the period as represented by begin -> end. 
* 
* @param begin 
* @param end 
* @param dtConstants 
* @param dtDateTimes 
* @return 
*/ 
public int numberOfOccurrencesInPeriod(final DateTime begin, final DateTime end, List<Integer> dtConstants, List<DateTime> dtDateTimes) { 
    int counter = 0; 
    for (DateTime current = begin; current.isBefore(end); current = current.plusDays(1)) { 
     for (Integer constant : dtConstants) { 
      if (current.dayOfWeek().get() == constant.intValue()) { 
       counter++; 
      } 
     } 
     for (DateTime dt : dtDateTimes) { 
      if (current.getDayOfWeek() == (dt.getDayOfWeek())) { 
       counter++; 
      } 
     } 

    } 
    return counter; 
} 

/** 
* Returns true if the period as represented by begin -> end contains any one of 
* the dates as represented by the <code>dtConstants</code> or the list of <code>dtDateTimes</code> 
* 
* @param begin 
* @param end 
* @param dtConstants 
* @param dtDateTimes 
*/ 
public boolean isInPeriod(final DateTime begin, final DateTime end, List<Integer> dtConstants, List<DateTime> dtDateTimes) { 
    return numberOfOccurrencesInPeriod(begin, end, dtConstants, dtDateTimes) > 0; 
} 
Các vấn đề liên quan