我有两个网络服务器,WEB1和WEB2。 该函数:
public static string ToTimeAgoHTML(this DateTime date)
{
return "<time class="timeago" datetime="" + date.ToString("o") + "">" + date.FriendlyDate() + "</time>";
}
在值上调用。 这些呈现为:
WEB1
<time class="timeago" datetime="2017-04-03T15:12:04.9072263Z">3 Apr, 2017</time>
WEB2
<time class="timeago" datetime="2017-04-03T15:12:04.9072263">3 Apr, 2017</time>
请注意,Web1 在末尾呈现一个z
,而 Web2 不这样做。 这会导致 Web2 上的请求在过去显示 1 小时。
两个网络服务器的时区都设置为Windows中的(UTC) Coordinated Universal Time
。
有谁知道这里会发生什么?
使用 ToString("o")
时的输出与您传入DateTime
的 Kind
属性有关:
- 使用
DateTimeKind.Utc
时,字符串将以Z
结尾 - 表示 UTC - 使用
DateTimeKind.Local
时,字符串将以 UTC 的偏移量结尾,例如-07:00
。 - 使用
DateTimeKind.Unspecified
,字符串将在时间部分之后结束。这可以是任何时间点,因为不会传达时区偏移量信息。
请注意,这与ISO8601标准完全一致。 MSDN 文档中也对此进行了描述。
要弄清楚为什么一台服务器产生的输出与另一台服务器不同,您必须弄清楚它们从哪里获取数据。 我的猜测是 Web1 正在发送源自 DateTime.UtcNow
的值,而 Web2 正在从文件、数据库中读取一个值,或者在不指定类型的情况下手动构造它。