【问题标题】:Get correct default(DateTime) in server在服务器中获取正确的默认值(日期时间)
【发布时间】:2018-02-06 20:54:39
【问题描述】:

我从用户那里获得了几个参数,在一些样板代码之后我获得了一个这样的 URL:

http://localhost:58756/api/Shippers/GetShippers?page=1&date=1/1/01%2012:00:00%20AM&parx=y&and more parameters...

date=1/1/01%2012:00:00%20AM 部分是这样获得的:

DateTime date=default(DateTime); 

这给出了1/1/01 12:00:00 AM,即Jan 1st of year 0001

我发送请求并且方法在 WebAPI 服务中被命中,但日期值被解析为:1/1/01 2001

我知道我可以使用Nullable DateTime 或将参数作为格式化日期ToString("mm/dd/yyyy") 等发送。

但是,如果我无法控制客户端发送的内容并且我保留了 DateTime 参数怎么办?我将如何区分服务器中的 2001 年 1 月 1 日和 0001 年 1 月 1 日?

【问题讨论】:

  • 如果您无法控制发送和接收的内容是1/1/01 12:00:00 AM,那么忘记您将如何在代码中执行它 - 怎么知道这意味着0001而不是2001?一旦您可以确定使用什么逻辑来确定正确的年份,那么您应该能够将其放入代码中。或者,如果不是,您可以告诉我们您使用的逻辑,我们可以帮助您将其放入代码中。 应该可能发生的是,如果您收到的是两位数的年份,那么应该说明这意味着什么(例如,它是 2000-2099 范围内或 1970-2069 范围内的日期。 ..).
  • 肯定分不清。你可能有更多信息。如果不是因为我刚刚编辑到之前的评论中,发件人应该能够告诉您日期的含义。如果他们发送的日期不明确(例如,因为 0001 和 2001 都是有效的),那么这是他们最后需要解决的错误。
  • 也许我的问题是:有没有办法告诉 WebAPI:“不要使用 2000 年的符号进行解析”?
  • 不要使用DateTime;只需使用string 并根据需要手动解析它。
  • @MikeMcCaughan 是的,我知道,我有这个选项等等......

标签: c# date datetime asp.net-web-api datetime-format


【解决方案1】:

解析两位数年份时,.NET 将使用当前区域性日历的TwoDigitYearMax 属性。默认情况下,大多数文化中使用的公历都会有一个值2029,这意味着两位数所涵盖的100年范围是从19302029

您可以通过将当前文化设置为 自定义 文化来更改此设置,该文化对此属性具有不同的值。

// clone the current calendar and change the range
Calendar cal = (Calendar) CultureInfo.CurrentCulture.Calendar.Clone();
cal.TwoDigitYearMax = 2099;  // changes the range to be 2000-2099 

// clone the culture, set the calendar, and make the new culture active
CultureInfo culture = (CultureInfo) CultureInfo.CurrentCulture.Clone();
culture.DateTimeFormat.Calendar = cal;
Thread.CurrentThread.CurrentCulture = culture;

// now all date parsing will use the new setting

the docs for the yy custom format specifier 中有一个更详细的示例,如果手动从字符串解析,则会使用该示例。但是,当解析代码位于堆栈的更深处时,将使用相同的方法。

至于将其更改为什么 - 正如 Chris 在 cmets 中指出的那样,只有您可以确定。

【讨论】:

    【解决方案2】:

    如果您仅获得 2 位数字,则无法确定它们是指 1901、2001、9001 还是 0001。这就是 字面意思 Y2k Bug 成为一件大事的原因back in the day.

    我有 3 条使用 Datatimes 的基本规则:

    1. 始终存储、检索和传输 UTC 值。您不想添加timezones to your troubles
    2. 避免以文本/字符串的形式存储、检索或传输。如果有合适的数据类型可供使用,请使用它。
    3. 如果您无法满足第 2 点,请在所有端点选择固定的文化格式和字符串编码。你不想让这种疯狂也成为你的麻烦。

    文化格式自然应该包含年份的所有数字。因为否则我们也会遇到像你这样的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      相关资源
      最近更新 更多