【问题标题】:ASP.net time rendering differently on different serversASP.net 时间在不同服务器上呈现不同
【发布时间】:2017-08-28 11:05:32
【问题描述】:

我有两个网络服务器,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

有人知道这里会发生什么吗?

【问题讨论】:

  • 文化是什么?
  • @Mason 两个网络服务器在 IIS 中是相同的 Invariant Language (Invariant Country)
  • 我会在实际线程上进行验证。检查Thread.CurrentThread.CurrentCultureThread.CurrentThread.CurrentUICulture
  • @Mason 两种文化在两台服务器上都是en-US
  • 文化在这种情况下是无关紧要的。 "o" 说明符始终与 ISO8601 对齐,后者使用 proleptic Gregorian calendar

标签: asp.net iis-7 timezone timezone-offset


【解决方案1】:

使用ToString("o")时的输出与你传入的DateTimeKind属性有关:

  • 使用DateTimeKind.Utc,字符串将以Z 结尾——表示UTC
  • 使用DateTimeKind.Local,字符串将以与UTC 的偏移量结尾,例如-07:00
  • 使用DateTimeKind.Unspecified,字符串将在时间部分之后结束。这可以是任何时间点,因为没有传达时区偏移信息。

请注意,这完全符合 ISO8601 标准。它也被描述为in the MSDN docs

要弄清楚为什么一台服务器产生的输出与另一台不同,您必须弄清楚它们从哪里获取数据。我的猜测是,Web1 正在发送一个源自 DateTime.UtcNow 的值,而 Web2 正在从文件、数据库中读取一个值,或者在没有指定种类的情况下手动构造它。

【讨论】:

  • 你说得对,谢谢!其中一台服务器正在从 Redis 读取,其中未指定 Kind。
  • 在从 Redis 检索时使用 DateTime.SpecifyKind
猜你喜欢
  • 2014-12-12
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
相关资源
最近更新 更多