当我们使用NodaTime对象时,获取错误的格式有点容易。例如,我们使用字符串插值来构造uri,但我们确实想要yyyy-MM-dd格式。日志记录也是如此,我们真的不需要任何其他格式。
LocalDate date = new LocalDate(2020, 8, 10);
string toString = $"{date}"; // "den 10 augusti 2020"
logger.LogInformation("Date: {Date}", date); // "Date: Monday, 10 August 2020"
ToString的文档(用于上面的第二行)指出:
“当前实例的值采用默认格式模式(“ D”),使用当前线程的区域性来获取格式提供程序。
如果我将当前区域性更改为InvariantCulture,则现在使上述两行均显示为“ 2020年8月10日,星期一”,这会更好,因为它们是一致的,但yyyy-MM-dd格式都不是。
System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
不过,理想情况下,我只想自定义NodaTime对象如何“字符串化”,以避免改变文化的任何其他不良影响。到这里有帮助吗?
编辑:
我制作了一个控制台应用程序,以尽量减少重复性的示例
Console.WriteLine(new LocalDate(2020,8,13));
Console.WriteLine(ZonedDateTime.FromDateTimeOffset(DateTimeOffset.Now));
Console.WriteLine(DateTime.Now);
Console.WriteLine(DateTimeOffset.Now);
并得到以下输出:
den 13 augusti 2020
2020-08-13T08:39:16 UTC+02 (+02)
2020-08-13 08:39:16
2020-08-13 08:39:16 +02:00
我希望LocalDate的默认输出为2020-08-13,它在日志以及字符串插值中更有用,例如: var uri = $"api/orders?date={localDate}"
实现此目的的最简单方法是使用CultureInfo
默认为ISO-8601格式的。从不变文化开始,创建它相当容易:
using NodaTime;
using System;
using System.Globalization;
using System.Threading;
class Program
{
static void Main(string[] args)
{
var isoCulture = (CultureInfo) CultureInfo.InvariantCulture.Clone();
var format = isoCulture.DateTimeFormat;
format.ShortDatePattern = "yyyy-MM-dd";
format.ShortTimePattern = "HH:mm:ss";
format.LongTimePattern = "HH:mm:ss.FFFFFFF";
format.FullDateTimePattern = "yyyy-MM-dd'T'HH:mm:ss.FFFFFFF";
format.LongDatePattern = format.ShortDatePattern;
Thread.CurrentThread.CurrentCulture = isoCulture;
Console.WriteLine(new LocalDate(2020, 8, 13));
Console.WriteLine(ZonedDateTime.FromDateTimeOffset(DateTimeOffset.Now));
Console.WriteLine(DateTime.Now);
Console.WriteLine(DateTimeOffset.Now);
}
}
输出:
2020-08-13
2020-08-13T09:52:18 UTC+01 (+01)
2020-08-13 09:52:18.7351962
2020-08-13 09:52:18.7356716 +01:00
我相信.NET在格式化a时只使用“ date pattern” {space}“ time pattern” DateTime
,因此我认为没有办法T
在其中添加a。但是,LocalDate
输出就是您想要的:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句