我即将创建一个转换器,将日期转换为自定义格式。
事实上,在一个转换器中,我有一个像17/05/2011 00:00:00这样的日期,我想将其转换为简单的17/05/2011。但是,也应该考虑文化。
在我上面的例子中,我有英国文化,但如果用户是美国人,那么它将被转换为05/17/2011。
实际上,我还需要一个ConvertBack将日期转换回数据库友好格式,无论文化如何,都可以将其保存回来,并且不会产生误解。
这是我第一次尝试失败了:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if(value == null)
return null;
DateTime date = DateTime.Parse(value.ToString(), culture);
return date;
}
同样令人惊讶的是,上面的CultureInfo参数是Us-en,尽管Windows中的所有内容都设置为英国。顺便说一下,我正在使用这个转换器用于Silverlight 4,也许在这里得到的文化是不同的......没有那么奇怪我得到了一个预期'字符串未被识别为有效的DateTime。'我认为这是因为我在那里的美国文化一个月不理解17。如何在Silverlight应用程序中设置我的本地文化?
然后我需要第二个转换器才能返回类似于上面的时间。我想我可以使用重载DateTimeStyles.NoCurrentDateDefault来生成日期的时间,对吗?
非常感谢您的帮助,
答案 0 :(得分:1)
可以在当前线程上设置文化,应用程序中的每个线程都可以在不同的文化中。
http://msdn.microsoft.com/en-us/library/system.threading.thread.currentculture(v=VS.100).aspx
好奇,如果你的计算机是在en-gb但是你的应用程序在en-us中,我猜测应用程序是明确地被放入文化中,可能是由配置文件。如果申请没有文化,那就需要OS文化。
在ASP.NET网络应用程序中,我记得你也可以在配置文件中指定文化。
你的最终目标是否只是为了切断DateTime
的时间部分?如果是,则可以使用DateTime.Date
属性,然后可以使用默认的.NET文化支持进行转换。
ConvertBack
方法可以将时间节省为UTC,DateTime
上有多种方法可以保存为UTC。 UTC包含时区信息,并采用一种格式,适用于数据库。
http://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime.aspx
虽然说实话,如果SQL Server是您的数据库服务器,只要您将日期存储为日期而不是字符串,再次为您提供文化。