【发布时间】:2014-06-06 14:34:12
【问题描述】:
我正在.NET 2.0 和 SQL Server Express 2005 上开发 WinForm 应用程序。
我遇到了日期时间转换的问题。
1) 我需要在 UI 上显示 datetime(datetimepicker),例如“dd/MM/yyyy”,所以我正在使用
public static void ChangeDateFormat(DateTimePicker dtp)
{
dtp.Format = DateTimePickerFormat.Custom;
dtp.CustomFormat = "dd/MM/yyyy";
}
2) 用于向我正在使用的 SQL Server 插入数据
datetimePicker1.ToShortDateString()
3) 从 SQL Server 获取数据
Convert(varchar(10),dt,103)
4) 将字符串日期“31/03/2013”分配给 datetimepiker
public static DateTime StringToDate(string value)
{
IFormatProvider formatProvider = new CultureInfo("en-GB");
DateTime dt = DateTime.Parse(value, formatProvider);
return dt;
}
5) 将 SQL 日期分配给 datetimepicker
Select dt from ams
datetimepicker1.value=DateTimeClass.dbDateTime( dt );
public static DateTime dbDateTime(string value)
{
IFormatProvider formatProvider = new CultureInfo("en-US");
DateTime dt = DateTime.Parse(value, formatProvider);
return dt;
}
问题:如果用户更改了 Windows 的区域或日期格式,则会发生错误。
我很困惑。我需要使我的应用程序区域独立。
【问题讨论】:
-
如果你只是从 Sql Server 返回
Date,而不是在 SQL Server 端将其转换为字符串,这一切都可以解决。然后你就不需要解析了。您可以在 C# 中进行格式化,例如var formattedString = dt.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture) -
您需要清楚地解释(在您的问题中,而不是通过评论)“发生错误”是什么意思。
-
您还应该将它作为
Date而不是字符串传递给SQL。仅当您(不恰当地)强制将日期时间数据表示为字符串时,才会(倾向于)出现格式问题。 -
@Habib 我认为这是一个好点,你认为这是对区域的了解吗?但有些地方我真的需要将 '31/03/2014' 转换为日期时间。
-
@SudhakarChaudhary,使用
CultureInfo.InvariantCulture转换为字符串将忽略当前区域并仅考虑提供的格式。 ParseExact 也是如此。
标签: c# sql-server datetime sql-server-2005 .net-2.0