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