2012-10-04 18 views
32

Tôi đang cố gắng xây dựng lịch biểu lặp lại hàng ngày trong Quartz.Net nhưng có một số vấn đề:Quartz.Net cách tạo lịch biểu hàng ngày không đạt được 1 phút mỗi ngày

Trước hết, tôi xây dựng hàng ngày tiến độ, repating lúc 12:45 Sử dụng mã Quartz.Net như thế này:

var trigger = TriggerBuilder.Create() 
    .WithDailyTimeIntervalSchedule(s => 
     s.OnEveryDay().StartingDailyAt(new TimeOfDay(13, 00))) 
.Build(); 

var times = TriggerUtils.ComputeFireTimes(trigger as IOperableTrigger, null, 10); 

foreach (var time in times) Console.WriteLine(time); 

này đã được thực hiện ở New Zealand, DST (vì vậy UTC + 13: 00)

Và kết quả tôi nhận được là khá lạ:

5/10/2012 1:00:00 p.m. +13:00 
5/10/2012 12:01:00 a.m. +00:00 
5/10/2012 12:02:00 a.m. +00:00 
5/10/2012 12:03:00 a.m. +00:00 
5/10/2012 12:04:00 a.m. +00:00 
5/10/2012 12:05:00 a.m. +00:00 
5/10/2012 12:06:00 a.m. +00:00 
5/10/2012 12:07:00 a.m. +00:00 
5/10/2012 12:08:00 a.m. +00:00 
5/10/2012 12:09:00 a.m. +00:00 

Ngày/giờ đầu tiên được hiển thị bằng múi giờ địa phương, phần còn lại được hiển thị bằng UTC và mỗi giá trị thời gian được tăng thêm 1 phút và ngày không bao giờ thay đổi.

Tôi cảm thấy mình có thể thiếu một số thứ cơ bản ở đây với lịch trình khoảng thời gian hàng ngày, nhưng tôi không biết nó là gì?

Sửa

Như một bản cập nhật để làm điều này, bây giờ tôi đã chuyển sang sử dụng một kích hoạt biểu CRON dựa trên:

TriggerBuilder.Create() 
    .WithCronSchedule(string.Format("0 {0} {1} ? * *", 0, 13)) 
    .Build(); 

Và nó đã cho tôi kết quả tôi mong chờ:

5/10/2012 12:00:00 a.m. +00:00 
6/10/2012 12:00:00 a.m. +00:00 
7/10/2012 12:00:00 a.m. +00:00 
8/10/2012 12:00:00 a.m. +00:00 
9/10/2012 12:00:00 a.m. +00:00 
10/10/2012 12:00:00 a.m. +00:00 
11/10/2012 12:00:00 a.m. +00:00 
12/10/2012 12:00:00 a.m. +00:00 
13/10/2012 12:00:00 a.m. +00:00 
14/10/2012 12:00:00 a.m. +00:00 

Nhưng tôi vẫn muốn biết lý do lịch trình DailyTimeIntervale không hoạt động ...

+11

TriggerUtils.ComputeFireTimes - tuyệt vời! –

Trả lời

43

Bạn không chỉ định khoảng thời gian xảy ra mặc định là 1 phút, do đó, giả sử bạn muốn chạy công việc mỗi phút.

Hãy thử

ITrigger trigger = TriggerBuilder.Create() 
    .WithDailyTimeIntervalSchedule 
     (s => 
     s.WithIntervalInHours(24) 
     .OnEveryDay() 
     .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(13, 0)) 
    ) 
    .Build(); 

Giá trị mặc định nên để chạy hàng ngày, vì vậy OnEveryDay() là không thực sự cần thiết.

Không chắc chắn lý do bạn thấy địa phương và UTC, vì tất cả thời gian của tôi được hiển thị bằng UTC.

+2

Sẽ không có bất kỳ vấn đề gì với Thời gian Ánh sáng Mặt trời? (xem [tại đây] (http://www.timeanddate.com/time/change/usa/los-angeles)) – dmigo

+0

tôi có thêm câu hỏi cho điều này, nếu tôi muốn bắt đầu hàng ngày và hai lần vào lúc 12 giờ sáng và 12 giờ tối , tôi làm thế nào? –

+0

@ NguyễnHuy. Tôi đoán 'ITrigger kích hoạt = TriggerBuilder.Create() .WithDailyTimeIntervalSchedule (s => s.WithIntervalInHours (12)) .Build(); 'hoặc' ITrigger kích hoạt = TriggerBuilder.Create() .WithDailyTimeIntervalSchedule (s => s.WithIntervalInHours (12) .OnEveryDay() .StartingDailyAt (TimeOfDay.HourAndMinuteOfDay (0, 0)) ) .Build(); ' – sgmoore

15

Trong khi WithIntervalInHours lẽ sẽ giải quyết này và một cron như tiến độ thậm chí còn linh hoạt hơn, tôi muốn chia sẻ một giải pháp khác: EndingDailyAfterCount(...)

var trigger = TriggerBuilder.Create() 
    .WithDailyTimeIntervalSchedule(s => s 
     .OnEveryDay() 
     .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(13, 00))) 
     .EndingDailyAfterCount(1)) 
.Build(); 
+1

đẹp ... điều này cũng được xung quanh vấn đề DST một cách thực sự thanh lịch! –

+0

@AndreasNiedermair Vui mừng tôi có thể giúp, chỉ cho kiến ​​thức cá nhân của tôi: Có cron của quartz.net như lịch trình có bất kỳ vấn đề dst? –

+0

Ah, theo như tôi có thể nhớ: thời gian nội bộ được lưu trữ trong UTC, vì vậy hoàn toàn bất khả tri với DST - có lẽ bạn sẽ phải lên lịch lại công việc sau khi DST thay đổi để phản ánh thay đổi trong dấu thời gian UTC liên quan ... (Nhưng tôi không ' t biết mà mở rộng - futurewise - gây nên được thêm khi thêm một biểu thức cron, hoặc nếu họ nhận được đánh giá trên bay) –

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