CultureInfo.InvariantCulture 和 DateTime to String 是如何工作的

本文关键字:何工作 工作 InvariantCulture DateTime to String CultureInfo | 更新日期: 2023-09-27 18:34:15

我一直在互联网上寻找有关此可选参数 CultureInfo.InvariantCulture 的信息,当在 .NET 中格式化时

这些文章对此进行了解释:文化信息不变文化是什么意思,不变文化是什么意思。但我仍然不清楚。

我想管理并将日期时间变量保存为这种格式"yyyyMMdd",我将其格式化为:

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

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

但是,无论系统中的哪种区域性(例如"en","es","fr"(,每个用户都可以设置,因此即使强制格式化为"YYYYMMDD"的方法ToString,我是否需要设置固定区域性?如果没有,我可以冒险将我的日期时间与另一种格式的字符串一起使用?数据库服务器中的区域配置是否重要?

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

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"

CultureInfo.InvariantCulture 和 DateTime to String 是如何工作的

对于您的特定用例,将区域性显式指定为 CultureInfo.InvariantCulture 并不是绝对必要的。

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

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

请,请使用参数化查询。了解如何以及为何使用参数化查询

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