2011-11-07 40 views
5

Mới dùng ruby ​​và gặp sự cố với một số chức năng ngày tháng. Tôi đang cố gắng thêm một tháng theo lịch vào một ngày được cung cấp, để "30 tháng 4 năm 2002", sẽ xuất ra "ngày 31 tháng 5 năm 2002". Đây là mã của tôiRuby thêm một tháng theo lịch

date = '30th Apr 2002' 
parseDate = Date.parse(date) 

(parseDate >> 1) # This returns 2002-05-30 

Có lẽ đây không phải là cách các chức năng được cho là để làm việc, trong trường hợp đó tôi sẽ cần phải viết một số mã để trả lại ngày cuối cùng của tháng tiếp theo, nếu ngày cung cấp là người cuối cùng Ngày trong tháng?

Bất kỳ trợ giúp nào cũng sẽ được đánh giá cao.

+0

Vì vậy, bạn sẽ phải thêm một tháng để nhận được ngày 30 tháng 5 năm 2002? Nếu tôi được hỏi ngày tháng một tháng sau ngày 30 tháng 4, tôi sẽ nói ngày 30 tháng 5 ... –

+0

Vâng, đây là logic tôi mong đợi, tuy nhiên yêu cầu của tôi nói rằng email nhắc nhở sẽ được gửi một tháng theo lịch trước khi ngày đáo hạn. Nếu ngày đến hạn là ngày 31 tháng 5, một email nhắc nhở sẽ được gửi vào ngày 30 tháng 4 năm – namtax

+0

Vì vậy, đó không phải là * thêm * một tháng theo lịch - đó là * trừ đi * một tháng theo lịch, rất khác. –

Trả lời

0

với activesupport

parseDate = parseDate + 1.month.since(parseDate) 

hoặc 30 ngày chính xác, vì vậy nó nó có thể trượt một chút

parseDate = parseDate + (30*24*60*60) 
+0

Xin chào, tôi nghĩ có lẽ câu hỏi của tôi không rõ ràng 100%. Jon Skeet đã giúp tôi, cảm ơn sự giúp đỡ của bạn. Cảm ơn – namtax

4

Các >> không chỉ tăng tháng và giữ cùng ngày trong tháng, mà như Skeet lưu ý trong một nhận xét là hơi nhạy cảm ...

Nhưng để có được hành vi bạn muốn, bạn chỉ có thể cộng và trừ một ngày theo đúng thứ tự để có ngày cuối cùng trên ranh giới tháng và sau:

((parseDate +1) >> 1) - 1 

Trừ các tháng, như xuất hiện trong các nhận xét bạn thực sự muốn, sử dụng cùng một thủ thuật nhưng toán tử tháng ngược lại.

((parseDate +1) << 1) - 1 
+0

Điều này sẽ chỉ làm việc trong trường hợp cạnh tôi cung cấp? Hoặc với tất cả các tháng? Cảm ơn – namtax

+0

Có trong trường hợp bạn đã cung cấp, như tôi đã xác minh trong irb. Tôi thấy không có lý do nó sẽ không làm việc nói chung. –

+0

sẽ không hoạt động trong tháng 2, kể từ ngày 28 hoặc 29 + 1 sẽ không chuyển vào tháng tiếp theo - các tháng còn lại sẽ hoạt động tốt. –

Các vấn đề liên quan