At the time of writing the latest version is 2.0.1. Getting this to run on Mono is a little tricky though, for starters it uses a call to a method in the System.TimeZoneInfo that at the time of writing hasn't been implemented in Mono 2.10:
public static DateTimeOffset ConvertTime (DateTimeOffset dateTimeOffset, TimeZoneInfo destinationTimeZone){throw new NotImplementedException();}
So we have a few options, trying to implement the missing feature is a little daunting so I took a shortcut and downloaded the previous version of Quartz.net 1.0.3, tweaked my code so that it used the old feature set and discovered that it works!
using System;
using Quartz;
using Quartz.Impl;
namespace Quartz
{
class MainClass
{
private static IScheduler _scheduler;
public static void Main (string[] args)
{
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
_scheduler = schedulerFactory.GetScheduler();
_scheduler.Start();
Console.WriteLine("Starting Scheduler");
AddJob();
}
public static void AddJob()
{
JobDetail job = new JobDetail("job1", "group1", typeof(MyJob));
Trigger trigger = TriggerUtils.MakeSecondlyTrigger("MyTrigger", 10, 10);
DateTime ft = _scheduler.ScheduleJob(job, trigger);
}
}
internal class MyJob : IMyJob
{
public void Execute(JobExecutionContext context)
{
Console.WriteLine("In MyJob class");
DoMoreWork();
}
public void DoMoreWork()
{
Console.WriteLine("Do More Work");
}
}
internal interface IMyJob : IJob
{
}
}
Here is it running:

What about the following function I just wrote (as of mono 3.0.0 ConvertTime with DateTimeOffset is still not implemented):
ReplyDeleteprivate static DateTimeOffset ConvertTime(DateTimeOffset dateTimeOffset, TimeZoneInfo destinationTimeZone) {
var destinationDateTime = TimeZoneInfo.ConvertTimeFromUtc(dateTimeOffset.ToUniversalTime().DateTime, destinationTimeZone);
return new DateTimeOffset(destinationDateTime, destinationTimeZone.GetUtcOffset(destinationDateTime));
}
Thanks for that, I'll check it out. What this space!
ReplyDeleteSorry I wrote unit tests to this code and it failed miserably at DST transition dates for some time zones. I have completely rewritten the function based on existing mono code for DateTime. I will submit a patch, hopefully it can make it into the next release of Mono. Here is the new code I suggest:
ReplyDelete#region Pending mono compatibility
public static DateTimeOffset ConvertTime(DateTimeOffset dateTimeOffset, TimeZoneInfo destinationTimeZone) {
return IsRunningOnMono ? ConvertTimeMono(dateTimeOffset: dateTimeOffset, destinationTimeZone: destinationTimeZone) : TimeZoneInfo.ConvertTime(dateTimeOffset: dateTimeOffset, destinationTimeZone: destinationTimeZone);
}
public static DateTimeOffset ConvertTimeMono(DateTimeOffset dateTimeOffset, TimeZoneInfo destinationTimeZone) {
if (destinationTimeZone == null) throw new ArgumentNullException("destinationTimeZone");
var utcDateTime = dateTimeOffset.UtcDateTime;
TimeZoneInfo.AdjustmentRule rule = GetApplicableRule(timeZoneInfo: destinationTimeZone, dateTime: utcDateTime);
if (rule != null && destinationTimeZone.IsDaylightSavingTime(utcDateTime)) {
var offset = destinationTimeZone.BaseUtcOffset + rule.DaylightDelta;
return new DateTimeOffset(DateTime.SpecifyKind(utcDateTime, DateTimeKind.Unspecified) + offset, offset);
}
else {
return new DateTimeOffset(DateTime.SpecifyKind(utcDateTime, DateTimeKind.Unspecified) + destinationTimeZone.BaseUtcOffset, destinationTimeZone.BaseUtcOffset);
}
}
private static TimeZoneInfo.AdjustmentRule GetApplicableRule(TimeZoneInfo timeZoneInfo, DateTime dateTime) {
//Transitions are always in standard time
DateTime date = dateTime;
if (dateTime.Kind == DateTimeKind.Local && timeZoneInfo != TimeZoneInfo.Local)
date = date.ToUniversalTime() + timeZoneInfo.BaseUtcOffset;
if (dateTime.Kind == DateTimeKind.Utc && timeZoneInfo != TimeZoneInfo.Utc)
date = date + timeZoneInfo.BaseUtcOffset;
var adjustmentRules = timeZoneInfo.GetAdjustmentRules();
if (adjustmentRules != null) {
foreach (var rule in adjustmentRules) {
if (rule.DateStart > date.Date)
return null;
if (rule.DateEnd < date.Date)
continue;
return rule;
}
}
return null;
}
#endregion