c# - NLog 使用波斯历日期格式

标签 c# calendar nlog persian

我对在我的 C# 项目中使用 NLog 很感兴趣,并且发现它很棒,但是
在我的国家/地区,客户使用“波斯日历”。
如您所知,微软开发了一个名为“C# Persian Calendar class”的库来支持。
我需要在两个地方使用波斯日历日期格式
1-消息时间戳
基于 2 日期的文件名
如何强制 NLog 在上述用法中使用“C# 波斯日历类”?
谢谢

最佳答案

您不必修改 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));
        }
    }
}

祝你好运!

关于c# - NLog 使用波斯历日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26773971/

相关文章:

c# - 如何让父线程等待子线程完成 - C#

calendar - 具有三态日颜色的jQuery移动日历

java - 如何使用 Java 中的 Calendar 对象获取特定日期信息?

c# - 无法将使用 NLog 的库发布到 NuGet

c# - 如何从 Asp Net Core WebApi 将日志存储到 Azure 表存储?

c# - 参数化动态 sql 不返回任何结果

c# - 避免处理函数的长 switch/if

c# - 如何处理类型未知且无关紧要的通用字典?

javascript - 回历(波斯历)对于 DwtCalendar.js

c# - ${basedir} 位于何处,使用 NLog?