如何使用 Jalali 日期触发 Hangfire 重复作业?

问题描述 投票:0回答:1

我正在尝试在 Hangfire 中设置使用 Jalali (Shamsi) 日历的定期作业。具体来说,我想根据“Shamsi 月的最后一天”或“Shamsi 周的第一天”等事件触发作业。

我尝试更改项目的文化设置,但没有达到预期的结果。我还想避免手动将日期转换为 Jalali。

var cultureInfo = CultureInfo.GetCultureInfo("fa-IR");
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
  
      
GlobalJobFilters.Filters.Remove(
                 GlobalJobFilters.Filters.OfType<JobFilter>().Where(c => c.Instance is CaptureCultureAttribute).FirstOrDefault().Instance
            );

有什么方法可以支持 Hangfire 中的 Jalali 日期进行作业调度吗?

任何指导将不胜感激!

c# .net hangfire culture jalali-calendar
1个回答
0
投票

Hangfire 的循环作业通常使用基于公历的 Cron 表达式,可能不直接支持 Jalali(波斯)日历。

您始终可以使用本机 System.Globalization.PersianCalendar。您可以将 GregorianDate 日期转换为 Persian Date 并可以检查特定日期。

using Hangfire;
using System.Globalization;
using System;

public class JalaliScheduler
{
    public static void ScheduleDailyJalaliJob(string jobId, Action jobAction)
    {
        // Trigger the job daily
        RecurringJob.AddOrUpdate(jobId, () => ExecuteJalaliJob(jobAction), Cron.Daily);
    }

    private static void ExecuteJalaliJob(Action jobAction)
    {
        var currentDate = DateTime.Now;
        PersianCalendar persianCalendar = new PersianCalendar();

        int jalaliYear = persianCalendar.GetYear(currentDate);
        int jalaliMonth = persianCalendar.GetMonth(currentDate);
        int jalaliDay = persianCalendar.GetDayOfMonth(currentDate);

        // Example: Only run the job on a specific Jalali date (e.g., 1st Farvardin)
        if (jalaliMonth == 1 && jalaliDay == 1) // 1st Farvardin (Jalali New Year)
        {
            jobAction.Invoke();
        }
    }
}

JalaliScheduler.ScheduleDailyJalaliJob("jalali-job", () =>
{
    Console.WriteLine("Jalali specific job executed!");
});

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.