在windows下开发程序,hangfire中用到了时区,采用的是本地时区:
TimeZoneInfo zone = TimeZoneInfo.Local;
RecurringJob.AddOrUpdate("任务", () => job.ExecuteAsync(), "0 0 23 * * ?", zone);
结果部署在centos中时提示以下错误:
System.InvalidOperationException: Recurring job can‘t be scheduled, see inner exception for details. ---> System.TimeZoneNotFoundException: The time zone ID ‘China Standard Time‘ was not found on the local computer. ---> System.IO.FileNotFoundException: Could not find file ‘/usr/share/zoneinfo/China Standard Time‘. File name: ‘/usr/share/zoneinfo/China Standard Time‘ at Interop.ThrowExceptionForIoErrno(ErrorInfo errorInfo, String path, Boolean isDirectory, Func`2 errorRewriter) at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String path, OpenFlags flags, Int32 mode) at System.IO.FileStream.OpenHandle(FileMode mode, FileShare share, FileOptions options) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options) at Internal.IO.File.ReadAllBytes(String path) at System.TimeZoneInfo.TryGetTimeZoneFromLocalMachine(String id, TimeZoneInfo& value, Exception& e) --- End of inner exception stack trace --- at System.TimeZoneInfo.FindSystemTimeZoneById(String id) at Hangfire.RecurringJobEntity..ctor(String recurringJobId, IDictionary`2 recurringJob, ITimeZoneResolver timeZoneResolver, DateTime now) --- End of inner exception stack trace --- at Hangfire.Server.RecurringJobScheduler.ScheduleRecurringJob(BackgroundProcessContext context, IStorageConnection connection, String recurringJobId, RecurringJobEntity recurringJob, DateTime now)
后来写一个测试程序将windows10和Centos的时区ID和名称列举出来:
Window10的时区共计141个:
cnetos的时区,共425个:
因此最后将代码改为如下,部署后运行成功:
TimeZoneInfo zone = TZConvert.GetTimeZoneInfo("Asia/Shanghai");
RecurringJob.AddOrUpdate("任务", () => job.ExecuteAsync(), "0 0 23 * * ?", zone);