我想将字符串“30/12/2012”转换为“2012/12/30”。我的应用程序设置为“en-CA”,但数据库默认接受 yyyy/MM/dd。
如何在不依赖服务器上设置的当前文化信息的情况下做到这一点?
正如所有评论所说,但到目前为止没有一个答案说:不要将它作为 string 传递给数据库。
尽早解析您收到的任何文本,然后在其他任何地方使用它DateTime
来表示它,包括您如何通过参数化 SQL 1将其发送到数据库。这适用于所有类型的值:尽快将其转换为数据的“自然”类型,并尽可能长时间地保持这种自然表示。日期不是字符串,只有在确实需要时才应将其转换为字符串 - 理想情况下是在将其显示给用户之前。
解析可以使用DateTime.ParseExact
或DateTime.TryParseExact
取决于这是“可疑”数据(例如来自用户)还是应该真正正确并且异常是对不可解析值的最适当反应的数据。CultureInfo.InvariantCulture
我建议您使用自定义格式字符串传入。例如:
DateTime date = DateTime.ParseExact(text, "dd/MM/yyyy",
CultureInfo.InvariantCulture);
(如果你做了很多日期/时间工作,你可能还想考虑使用我的Noda Time 项目,它可以让你以更丰富的方式表达价值——在这种情况下,你可能会使用LocalDate
.)
1如果您尚未使用参数化 SQL,而是将值直接烘焙到 SQL 中,那么您遇到的问题比日期/时间转换更大。
您可以在 Format 和大多数 ToString 函数中指定 CultureInfo。
即DateTime.ToString(CultureInfo)和DateTime.Parse(string, CultureInfo)将让您在一种文化(即当前或new CultureInfo("en-CA")
)中解析字符串并使用另一种类似的格式new CultureInfo("en-us")
。
注意:您可以考虑通过设置 Thread.CurrentCulture 在其他文化(即en-US
)下运行所有数据库访问,因为有时数字格式也会受到影响(如果数字存储为字符串)。
如果它总是采用相同的格式。然后在/
角色上拆分
string[] tempsplit = datestring.Split('/');
然后把它放回去
string joinstring = "/";
string newdate = tempsplit[2] + joinstring + tempsplit[1] + joinstring + tempsplit[0];
简单的。
首先使用将您的字符串转换为 DateTime 格式
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());
}