【问题标题】:How does CultureInfo.InvariantCulture and DateTime to String worksCultureInfo.InvariantCulture 和 DateTime to String 的工作原理
【发布时间】:2016-02-10 19:55:40
【问题描述】:

我一直在 Internet 上寻找有关在 .NET 中格式化时这个可选参数 CultureInfo.InvariantCulture 的信息

这些文章对此进行了解释:What does cultureinfo invariantculture meanWhat is the invariant culture。但对我来说仍然不清楚。

我想管理一个日期时间变量并将其保存为这种格式“yyyyMMdd”,我将其格式化如下:

DateTime localDateTime = DateTime.Today; //> 2016-02-10 12:33
string formattedDateTime = localDateTime.ToString("yyyyMMdd"); //> 20160210

应该在 db 中有一个长度为 8 的 varchar 列。但在特定情况下,它开始保存 7 个字符。我正在等待访问我们客户的域以检查保存的格式。

但是,每个用户都可以设置系统中的任何文化(例如“en”、“es”、“fr”),所以即使方法 ToString 被强制格式化为“YYYYMMDD”,我是否需要设置不变的文化?如果没有,我可能会冒险将我的日期时间设置为另一种格式的字符串?数据库服务器的区域配置重要吗?

这是我现在正在尝试做的,但不确定这是否会在我们签入测试后解决问题:

DateTime localDateTime = DateTime.Today;
string formattedDateTime = localDateTime.ToString("yyyyMMdd", CultureInfo.InvariantCulture); //> 20160210

这是另一个作用域,如果我需要从数据库构建变量并将其保存在存储过程中,我正在这样做:

CONVERT(varchar, getdate(), 112) --ISO for yyyymmdd

编辑:

我们做了一些测试:

DateTime currentDateTime = dateParameter; // 10/2/16 12:33 PM
string dateParameterAsString = dateParameter.ToString(); // "10/2/16 12:33 PM"
string formattedIdentifier = dateParameter.ToString(System.Globalization.CultureInfo.InvariantCulture); // "02/10/2016 12:33:00"
string formattedIdentifier2 = dateParamter.ToString("yyyyMMdd"); // "20160218"
string formattedIdentifier3 = dateParamter.ToString("yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture); // "20160218"

【问题讨论】:

  • 帮自己一个忙,不要将日期时间信息存储为字符数据。将其存储为日期或日期时间。
  • 如果您只是为了构建 SQL 字符串而尝试进行转换,最好使用SqlParameters
  • @SeanLange 事实上,我们在 db 中使用一个 datime 列作为这个 datetime 值。但是,根据我们流程中的一些评估,我们将此值作为标识符保存在另一列中以用于商业目的。
  • YYYMMDD 不是将日期时间转换为字符串的正确格式字符串。 (yyyyMMdd) 并且使用这种格式,您不需要任何 CultureInfo,但请返回评论 #1
  • @batmaci 这个问题清楚地标有 sql server,它确实具有 datetime 数据类型。 sqlite 没有这一事实清楚地表明它是一种我会尽快逃避的技术。多么巨大的缺点。

标签: c# sql-server localization format cultureinfo


【解决方案1】:

对于您的特定用例,将文化明确指定为 CultureInfo.InvariantCulture 并不是绝对必要的。

对于格式字符串"yyyyMMdd",所有组件都将仅输出整数字符,并且恰好不受文化影响。使用CultureInfo.InvariantCulture 可能会稍微提高性能(避免必须查找当前线程的文化),如果您想针对非常具体的信息进行开发,养成习惯并不是一件坏事。如果您使用 "ddd" 或其他任何涉及月份、日期等名称的内容(或仅使用不带参数的 .ToString(),这将由当前线程的文化决定整个事情),这只会是一个问题)

也就是说,让我们看看这里的另一个问题:您正在创建要存储在数据库中的字符串。为什么要在此处而不是在表示层中执行此操作?你不使用参数化查询吗?

请,请使用参数化查询。见How and Why to Use Parameterized Queries

【讨论】:

  • 感谢您的宝贵回答。它不是在表示层计算的。它是在一个接收所有参数的服务库中完成的,一旦计算,所有数据都由一个使用内部 SqlParameters 的 ORM 库管理。我们现在正在分析执行此计算的服务方法。恐怕在日期时间为 2016-02-01 的情况下,它被保存为 201621(6 个字符)
【解决方案2】:

正如您在 cmets 中提到的,您有一个日期时间字段,并且您将有一个字符表示。在这种情况下,我建议您使用计算列并在数据库级别执行所有操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-14
    • 2014-08-28
    • 2016-10-12
    • 2015-02-24
    • 2022-11-30
    • 2017-11-19
    • 1970-01-01
    • 2014-07-06
    相关资源
    最近更新 更多