Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有不同时区的Quartz.Net DailyTimeIntervalTriggerImpl_C#_.net_Quartz Scheduler_Quartz.net - Fatal编程技术网

C# 具有不同时区的Quartz.Net DailyTimeIntervalTriggerImpl

C# 具有不同时区的Quartz.Net DailyTimeIntervalTriggerImpl,c#,.net,quartz-scheduler,quartz.net,C#,.net,Quartz Scheduler,Quartz.net,对,这有点棘手 我想创建一个每日触发器(DailyTimeIntervalTriggerImpl),以便它每天从07:30运行到23:45。 问题是,它必须在用户指定的时区运行,在这种情况下,比如东京时间 根据我的理解,我需要将时间转换为utc 下面的示例工作正常,但触发器将在endTimeUTC之后过期。如何确保触发器连续运行 注意:我曾尝试使用DailyTimeIntervalTriggerImpl的StartTimeOfDay和EndTimeOfDay属性,但当我将它们转换为UTC时,会出

对,这有点棘手

我想创建一个每日触发器(DailyTimeIntervalTriggerImpl),以便它每天从07:30运行到23:45。 问题是,它必须在用户指定的时区运行,在这种情况下,比如东京时间

根据我的理解,我需要将时间转换为utc

下面的示例工作正常,但触发器将在endTimeUTC之后过期。如何确保触发器连续运行

注意:我曾尝试使用DailyTimeIntervalTriggerImpl的StartTimeOfDayEndTimeOfDay属性,但当我将它们转换为UTC时,会出现奇怪的点火时间。 我认为问题在于:

a) utc格式的开始时间(在本例中)将为2012年12月31日10:30:00 PM

b) utc的结束时间为2013年1月1日下午2:30(次日)

DailyTimeIntervalTriggerImplStartTimeOfDayEndTimeOfDay仅采用a TimeOfDay对象,该对象仅考虑时间而非日期

所以它将是StartTimeOfDay=10:30PM和EndTimeOfDay=2:30PM,这是没有意义的。因为一天的结束时间应该是第二天下午2:30

有什么想法吗

 var startTime = DateTime.Parse("2013/01/01 07:30:00");
 var endTime = DateTime.Parse("2013/01/01 23:45:00");

 var tokyoTimeZoneId = "Tokyo Standard Time";

 TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(tokyoTimeZoneId);

 var startDateTimeUtc = TimeZoneInfo.ConvertTimeToUtc(startTime, timeZoneInfo);
 var endDateTimeUtc = TimeZoneInfo.ConvertTimeToUtc(endTime, timeZoneInfo);

 var dailyTrigger = new DailyTimeIntervalTriggerImpl
  {
    RepeatIntervalUnit = IntervalUnit.Hour,
    DaysOfWeek = GetDays(), // method to get a Quartz.Collection.HashSet list
    RepeatInterval = 3, // every 3 hours
    Key = new TriggerKey(Guid.NewGuid().ToString(), "my-group"),
    StartTimeUtc = startDateTimeUtc,
    EndTimeUtc = endDateTimeUtc,
  };

  // Compute fire times just to show simulated fire times
  IList<DateTimeOffset> fireTimes = ComputeFireTimes(dailyTrigger, null, 10);

  foreach (var dateTimeOffset in fireTimes)
  {
    Console.WriteLine("utc:{0} tokyo:{1}", dateTimeOffset,
      TimeZoneInfo.ConvertTimeFromUtc(dateTimeOffset.DateTime, timeZoneInfo));
  }
var startTime=DateTime.Parse(“2013/01/01 07:30:00”);
var endTime=DateTime.Parse(“2013/01/01 23:45:00”);
var tokyoTimeZoneId=“东京标准时间”;
TimeZoneInfo TimeZoneInfo=TimeZoneInfo.FindSystemTimeZoneById(tokyoTimeZoneId);
var startDateTimeUtc=TimeZoneInfo.ConvertTimeToUtc(startTime,TimeZoneInfo);
var endDateTimeUtc=TimeZoneInfo.ConvertTimeToUtc(endTime,TimeZoneInfo);
var dailyTrigger=新的DailyTimeIntervalTriggerImpl
{
RepeatIntervalUnit=IntervalUnit.小时,
DaysOfWeek=GetDays(),//获取Quartz.Collection.HashSet列表的方法
RepeatInterval=3,//每3小时
Key=newtriggerkey(Guid.NewGuid().ToString(),“我的组”),
StartTimeUtc=startDateTimeUtc,
EndTimeUtc=endDateTimeUtc,
};
//计算火灾时间只是为了显示模拟火灾时间
IList fireTimes=ComputeFireTimes(dailyTrigger,null,10);
foreach(fireTimes中的var dateTimeOffset)
{
Console.WriteLine(“utc:{0}东京:{1}”),dateTimeOffset,
TimeZoneInfo.ConvertTimeFromUtc(dateTimeOffset.DateTime,TimeZoneInfo));
}
试试这个:

var daysOfWeek = new Quartz.Collection.HashSet<System.DayOfWeek>() { System.DayOfWeek.Wednesday, System.DayOfWeek.Thursday, System.DayOfWeek.Friday };

DateTimeOffset startTime = DateBuilder.DateOf(0, 0, 0, 14, 1, 2013);
DateTimeOffset endTime = DateBuilder.DateOf(0, 0, 0, 20, 1, 2013);

TimeOfDay startTimeOfDay = TimeOfDay.HourMinuteAndSecondOfDay(7, 30, 0);
TimeOfDay endTimeOfDay = TimeOfDay.HourMinuteAndSecondOfDay(23, 45, 0);

var tokyoTimeZoneId = "Tokyo Standard Time";
TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(tokyoTimeZoneId);

var dailyTrigger = new DailyTimeIntervalTriggerImpl
{
StartTimeUtc = startTime.ToUniversalTime(),
EndTimeUtc = endTime.ToUniversalTime(),
StartTimeOfDay = startTimeOfDay,
EndTimeOfDay = endTimeOfDay,
RepeatIntervalUnit = IntervalUnit.Hour,
DaysOfWeek = daysOfWeek,
RepeatInterval = 3,             // every 3 hours
TimeZone = timeZoneInfo,
Key = new TriggerKey(Guid.NewGuid().ToString(), "my-group"),
};

// Compute fire times just to show simulated fire times
IList<DateTimeOffset> fireTimes = TriggerUtils.ComputeFireTimes(dailyTrigger, null, 1000);

foreach (var dateTimeOffset in fireTimes)
{
Console.WriteLine("utc:{0} - tokyo:{1}", dateTimeOffset,
  TimeZoneInfo.ConvertTimeFromUtc(dateTimeOffset.DateTime, timeZoneInfo));
}
var daysOfWeek=new Quartz.Collection.HashSet(){System.DayOfWeek.周三,System.DayOfWeek.周四,System.DayOfWeek.周五};
DateTimeOffset startTime=DateBuilder.DateOf(0,0,0,14,12013);
DateTimeOffset endTime=DateBuilder.DateOf(0,0,0,20,12013);
TimeOfDay startTimeOfDay=TimeOfDay.HourMinuteAndSecondOfDay(7,30,0);
TimeOfDay endTimeOfDay=TimeOfDay.HourMinuteAndSecondOfDay(23,45,0);
var tokyoTimeZoneId=“东京标准时间”;
TimeZoneInfo TimeZoneInfo=TimeZoneInfo.FindSystemTimeZoneById(tokyoTimeZoneId);
var dailyTrigger=新的DailyTimeIntervalTriggerImpl
{
StartTimeUtc=startTime.ToUniversalTime(),
EndTimeUtc=endTime.ToUniversalTime(),
StartTimeOfDay=StartTimeOfDay,
EndTimeOfDay=EndTimeOfDay,
RepeatIntervalUnit=IntervalUnit.小时,
DaysOfWeek=DaysOfWeek,
RepeatInterval=3,//每3小时
时区=时区信息,
Key=newtriggerkey(Guid.NewGuid().ToString(),“我的组”),
};
//计算火灾时间只是为了显示模拟火灾时间
IList fireTimes=TriggerUtils.ComputeFireTimes(dailyTrigger,null,1000);
foreach(fireTimes中的var dateTimeOffset)
{
Console.WriteLine(“utc:{0}-东京:{1}”),dateTimeOffset,
TimeZoneInfo.ConvertTimeFromUtc(dateTimeOffset.DateTime,TimeZoneInfo));
}
注意


我建议您使用最新版本:2.1.1。谢谢我刚刚试着删除StartTimeUtc和EndTimeUtc,只保留StartTimeOfDay和EndTimeOfDay,效果很好!看起来最新的石英版本,它采用了时区信息,似乎做到了这一点。