如何在 NodaTime 中将 Instant 打印为 rfc2822?

How do I print an Instant as rfc2822 in NodaTime?

我想在 NodaTime 中将 Instant 打印为 rfc2822。怎么样?

快速搜索导致损坏的 google 代码链接。我更喜欢内置的命名模式,而不是为 ToString 提供所有格式。

I'd prefer a built-in named pattern over supplying all formatting to ToString.

如果你的意思是你期待 "standard" 模式,可以这么说,没有。

但是,为此编写自定义模式非常容易 - 给你一个 InstantPattern 而不是像你提到的那样将它全部传递到 ToString

幸运的是,格式化 RFC 2822 比解析 简单得多 - 特别是如果您乐于用 UTC 表达所有内容。看看 RFC 2822 本身,两件事 spring 出来:

  • "The date and time-of-day SHOULD express local time." 如果你想这样做,你应该格式化 OffsetDateTime 而不是 Instant.

  • 星期几是可选的 - 但根据我的经验,它几乎应该存在。

忽略 "should express local time" 部分,我会使用:

var pattern = InstantPattern.CreateWithInvariantCulture
   ("ddd d MMM yyyy HH:mm:ss '+0000'");
// Test it...
Console.WriteLine(pattern.Format(SystemClock.Instance.Now));

(未来读者请注意:从 Noda Time 2.0 开始,请使用 IClock.GetCurrentInstant() 而不是 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