CultureInfo.InvariantCulture和DateTime to String如何工作

时间:2016-02-10 19:55:40

标签: c# sql-server localization format cultureinfo

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

这些文章解释了它: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中有一个varchar列,长度为8.但在特定情况下,它开始保存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"

2 个答案:

答案 0 :(得分:1)

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

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

那就是说,让我们看看另一个问题:你要创建存储在数据库中的字符串。为什么要在这里而不是在表示层中完成?你没有使用参数化查询吗?

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

答案 1 :(得分:1)

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