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
并不是绝对必要的。
对于格式字符串"yyyyMMdd"
,所有组件将只输出整数字符,并且恰好不受区域性的影响。使用 CultureInfo.InvariantCulture
可能是一个很小的性能改进(避免了必须查找当前线程的区域性(,并且如果您想针对非常具体的信息进行开发,养成习惯并不是一件坏事。只有当您使用 "ddd"
或任何其他涉及月、日等名称的内容(或者只是使用不带参数的.ToString()
时,这才是一个问题,这将由当前线程的区域性决定整个事情(
也就是说,让我们看看这里的另一个问题:您正在创建要存储在数据库中的字符串。为什么在这里而不是在表示层中完成此操作?是否不使用参数化查询?
请,请使用参数化查询。了解如何以及为何使用参数化查询
正如您在评论中提到的,您有一个日期时间字段,您将拥有该字段的字符表示形式。在这种情况下,我建议您使用计算列并在数据库级别执行所有操作。