NLog使用波斯日历日期格式

时间:2014-11-06 07:30:50

标签: c# calendar nlog persian

我有兴趣在我的C#项目中使用NLog,发现它很棒,但是 在我的国家,客户使用"波斯日历" 如您所知,Microsoft开发了一个库以支持命名的" C#波斯日历类" 我需要两个地方的波斯日历日期格式
1消息时间戳
基于2日期的文件名
如何强制NLog使用" C#波斯日历课"以上用法?
感谢

2 个答案:

答案 0 :(得分:2)

这有两个困难:

  • 您需要弄清楚如何在这两种情况下执行格式设置,并了解如何自定义格式,例如通过指定不同的文化或格式代理
  • 波斯日历目前不是任何文化的可选日历,因此使用DateTime.ToString无论如何都无法使用:(

您肯定需要查看NLog的源代码(或至少是文档),以确定是否有一种配置格式的方法。一旦你弄清楚如何让你自己的代码在那里执行 - 例如通过编写自己的子类,可能 - 你需要弄清楚如何进行实际格式化。

可以使用BCL执行此操作,调用PersianCalendar并执行简单的数字格式设置。或者你可以使用我的Noda Time库,它也有波斯日历支持(从Noda Time 1.3开始)。你想要的东西是:

var gregorian = new LocalDate(2014, 11, 6); // Or whatever
var persian = gregorian.WithCalendar(CalendarSystem.GetPersianCalendar());
var text = persian.ToString("yyyy-MM-dd"); // Or create a LocalDatePattern

答案 1 :(得分:2)

您不必修改NLog源并自行构建。您可以编写自己的PersianDateLayoutRenderer。然后,将NLog配置为使用布局渲染器而不是NLog内置布局渲染器中的渲染器是一个简单的问题。当您升级到新版本NLog时,您的布局渲染器仍然可以正常工作。

这是一个结合了NLog的LongDateLayoutRenderer和.NET Persian Calendar的例子。我不知道波斯语日期是否有格式化,所以我只是硬编码格式。

您可以使用$ {persianlongdate}而不是$ {shortdate},$ {longdate}或$ {date}在NLog.config文件中进行配置。

我还没有尝试构建或运行它,但它应该非常接近。如果您决定尝试这条路线,您可以轻松修改它以使用Jon的Noda Time。

您可以在此处找到NLog的LongDateLayoutRenderer(以及DateLayoutRenderer和ShortDateLayoutRenderer)的来源:

https://github.com/NLog/NLog/blob/master/src/NLog/LayoutRenderers

namespace MyLayoutRenderers
{
    using System.ComponentModel;
    using System.Globalization;
    using System.Text;

    using NLog.Config;

    [LayoutRenderer("persianlongdate")]
    [ThreadAgnostic]
    public class PersianSLongDateLayoutRenderer : LayoutRenderer
    {
        PersianCalendar pc = new PersianCalendar();

        /// <summary>
        /// Gets or sets a value indicating whether to output UTC time instead of local time.
        /// </summary>
        /// <docgen category='Rendering Options' order='10' />
        [DefaultValue(false)]
        public bool UniversalTime { get; set; }

        /// <summary>
        /// Renders the current short date string (yyyy-MM-dd) and appends it to the specified <see cref="StringBuilder" />.
        /// </summary>
        /// <param name="builder">The <see cref="StringBuilder"/> to append the rendered data to.</param>
        /// <param name="logEvent">Logging event.</param>
        protected override void Append(StringBuilder builder, LogEventInfo logEvent)
        {
            DateTime ts = logEvent.TimeStamp;

            //Not sure if UniversalTime makes sense for PersianCalendar.  Do you?
            if (this.UniversalTime)
            {
                ts = ts.ToUniversalTime();
            }

            builder.Append(String.Format("{0}-{1}-{2}-{3}:{4}-{5}-{6}",
                pc.GetDayOfWeek(ts),
                pc.GetMonth(ts),
                pc.GetDayOfMonth(ts),
                pc.GetYear(ts),
                pc.GetHour(ts), 
                pc.GetMinute(ts),
                pc.GetSecond(ts));
        }
    }
}
祝你好运!