我希望在NodaTime中将一个Instant打印为rfc2822。怎么样?
快速搜索会导致谷歌代码链接中断。我更喜欢内置的命名模式而不是向ToString提供所有格式。
答案 0 :(得分:3)
我更喜欢内置的命名模式而不是向ToString提供所有格式。
如果你的意思是你期待一种“标准”模式可以这么说,那就没有了。
但是,为此编写自定义模式很容易 - 如您所述,为InstantPattern
提供ToString
而不是将其全部传递到OffsetDateTime
。
幸运的是,格式化 RFC 2822比解析简单得多 - 特别是如果您乐意用UTC表达所有内容。看看RFC 2822本身,有两件事情出现了:
“日期和时间应该表达当地时间。”如果您想这样做,则应格式化Instant
而不是var pattern = InstantPattern.CreateWithInvariantCulture
("ddd d MMM yyyy HH:mm:ss '+0000'");
// Test it...
Console.WriteLine(pattern.Format(SystemClock.Instance.Now));
。
星期几是可选的 - 但根据我的经验,它几乎可以在那里。
忽略“应该表达当地时间”部分,我会使用:
IClock.GetCurrentInstant()
(未来读者注意:自Noda Time 2.0起,请使用IClock.Now
代替Sat 4 Apr 2015 09:55:49 +0000
。)
示例输出:
OffsetDateTimePattern
如果您想沿着var pattern = OffsetDateTimePattern.CreateWithInvariantCulture
("ddd d MMM yyyy HH:mm:ss o<+HHmm>");
路线前进,则需要:
Sat 4 Apr 2015 10:57:27 +0100
然后你会得到如下输出:
{{1}}