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