适用于所有文化的最佳DateTime转换器

时间:2011-05-17 21:55:19

标签: wpf silverlight datetime converter

我即将创建一个转换器,将日期转换为自定义格式。

事实上,在一个转换器中,我有一个像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来生成日期的时间,对吗?

非常感谢您的帮助,

1 个答案:

答案 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是您的数据库服务器,只要您将日期存储为日期而不是字符串,再次为您提供文化。