【问题标题】:Convert.ToString(DateTime.UtcNow) unexpected beheviour?Convert.ToString(DateTime.UtcNow) 意外行为?
【发布时间】:2012-03-01 12:28:02
【问题描述】:

我有 asp.net 站点(框架 4.0),它工作正常,在 SQM 2000 数据库中记录用户登录/注销时间。我用Convert.ToString(DateTime.UtcNow)这个方法来获取系统时间。

有时它保存“yyyy-MM-dd”格式,它很好但有时“yyyy-dd-MM”,那么如何调试它,托管在共享环境中的站点,所以我认为时间格式会在任何地方保持一致.

相同的用途有两种格式。所以我无法重现它。

即它将今天的日期保存在 "2012-03-01" && "2012-01-03" 中,

请告诉我,它有什么问题?

谢谢, 乳糜泻

【问题讨论】:

  • 如果您将日期存储在数据库中,为什么要将其转换为字符串?我希望这是一个日期时间专栏!

标签: asp.net datetime


【解决方案1】:

首先 - 将日期保存为字符串并不是一个好主意。尝试在您的数据库中使用日期类型。
看起来用户运行 Convert.ToString(DateTime.UtcNow) 来自不同的文化。您可以使用 Guffa 提供的方法,但如果您尝试使用第二种变体,您应该记住,对于某些文化,它可以格式化为“2012/03/01”,因为框架将“-”作为格式符号,应该转换为指定的分隔符用于用户文化。
所以我再次建议您将日期作为日期对象存储在您的数据库中。

【讨论】:

  • 请注意,我在格式字符串中使用了'-',而不是-,因此它将是文字短划线字符,而不是解释为日期分隔符。
  • 谢谢古法。好把戏。但我仍然认为将日期作为字符串存储在数据库中是个坏主意:)
  • 是的,当然他应该尽可能使用日期类型。我在想他使用了一些根本不支持日期类型的数据库解决方案,请参阅我在回答中写的编辑。
【解决方案2】:

似乎服务器的默认文化可能会改变。您应该对任何依赖于文化的转换使用特定的文化对象,而不是使用默认值。例如:

CultureInfo culture = new CultureInfo("EN-gb");
string date = Convert.ToString(DateTime.UtcNow, culture);

(您当然可以保留CultureInfo 对象,只要实用即可,而不是为每次使用都创建一个。)

或者指定自定义格式:

string date = DateTime.UtcNow.ToString("yyyy'-'MM'-'dd");

编辑:

我试图寻找一个“SQM 2000”数据库来查看它是什么,但什么也没找到。如果您指的是 Microsoft SQL Server 2000 数据库,那么它能够将日期存储为 datetime 数据类型,因此您首先不应将日期转换为字符串。

【讨论】:

  • 我在 web.config 中已经有了应用程序级文化 en-US, 那么在不同的文化中怎么可能呢?
  • 问题很可能不是服务器的默认文化正在改变。看我的回答。
猜你喜欢
  • 2017-03-10
  • 2019-05-01
  • 2011-07-15
  • 2011-04-27
  • 2019-12-07
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多