我想将字符串 '30/12/2012' 转换为 '2012/12/30'。我的应用程序设置为 "en-CA",但数据库默认接受 yyyy/MM/dd。
如何在不依赖于服务器上当前文化信息的情况下完成此操作?
正如所有的评论所说,但迄今为止没有一个答案提到:不要将此作为字符串传递给数据库。
尽早将收到的任何文本解析,然后使用 DateTime
表示它在任何其他地方,包括通过参数化 SQL1 将其发送到数据库的方式。这适用于所有类型的值:尽早将其转换为数据的“自然”类型,并尽可能长时间地保持在该自然表示中。日期不是字符串,只有在真正需要时才将其转换为字符串 - 最好是在将其显示给用户之前 仅仅。
可以使用 DateTime.ParseExact
或 DateTime.TryParseExact
进行解析,具体取决于数据是否“可疑”(例如来自用户)或应该确实正确并且无法解析的值最合适的反应是异常。建议您在自定义格式字符串中传递 CultureInfo.InvariantCulture
。例如:
DateTime date = DateTime.ParseExact(text, "dd/MM/yyyy",
CultureInfo.InvariantCulture);
(如果你需要大量处理日期/时间,你可能还想考虑使用我的Noda Time项目,它允许你以更丰富的方式表达值 - 在这种情况下,你可能会使用LocalDate
。)
1 如果你还没有使用参数化SQL,而是直接将值嵌入SQL中,那么你比日期/时间转换更有大问题。
/
进行分割。string[] tempsplit = datestring.Split('/');
string joinstring = "/";
string newdate = tempsplit[2] + joinstring + tempsplit[1] + joinstring + tempsplit[0];
简单。
Split('/')
,结果将是 "20120620"
。老实说,我几乎总是测试我公开发布的代码。 - KobiDateTime
解析然后重新格式化? - Jon Skeetnew CultureInfo("en-CA")
)解析字符串,并在另一个文化环境中格式化,如new CultureInfo("en-us")
。en-US
),因为有时数字格式也会受到影响(如果数字存储为字符串)。DateTime dt = Convert.ToDateTime("your string value");
然后使用以下代码将其存储为字符串:
string st=dt.ToString("yyyy/MM/dd");
这将把您的日期格式转换为任何您想要的格式,而不依赖于文化背景。
这似乎可行。
var x = new string[] { "2012/06/12", "20/06/2012", "111/111/1111" };
foreach (var ds in x)
{
DateTime d = default(DateTime);
try
{
d = DateTime.Parse(ds, CultureInfo.GetCultureInfo("en-CA"));
}
catch (Exception ex)
{
try
{
d = DateTime.ParseExact(ds, "yyyy/MM/dd", CultureInfo.InvariantCulture);
}
catch
{
}
}
if (d == default(DateTime))
Console.WriteLine("error");
else
Console.WriteLine(d.ToString());
}
DateTime
对象,为您的SQL存储过程/脚本创建一个参数,并在参数中指定该值为DateTime类型。 - rikitikitik