2013-06-04 40 views
11

我的应用程序将数据跨多个不同的设备进行同步。出于这个原因,它将所有日期存储在UTC时区,以考虑可能设置为不同时区的不同设备。在WPF/XAML中的本地时区中显示时间

问题是,当我读取日期并显示它们时,它们看起来不正确(大多数用户在英国夏令时,因此他们落后了一个小时)。

<TextBlock Margin="5" Style="{StaticResource SmallTextblockStyle}"> 
    <Run Text="Last Updated:" /> 
    <Run Text="{Binding Path=Submitted}" /> 
</TextBlock> 

是否需要手动覆盖UI线程的CurrentCulture属性?我知道我必须在Silverlight中执行此操作。

回答

12

当解析存储的DateTime并将其转换为DateTime.ToLocalTime()时,您是否指定“Utc”为DateTime.Kind

public DateTime Submitted { 
    get { 
    DateTime utcTime = DateTime.SpecifyKind(DateTime.Parse(/*"Your Stored val from DB"*/), DateTimeKind.Utc); 

    return utcTime.ToLocalTime(); 
    } 

    set { 
    ... 
    } 
} 

^^为我工作得很好

更新:

class UtcToLocalDateTimeConverter : IValueConverter 
    { 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
     return DateTime.SpecifyKind(DateTime.Parse(value.ToString()), DateTimeKind.Utc).ToLocalTime(); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { 
     throw new NotImplementedException(); 
    } 
    } 

XAML:

<Window.Resources> 
    <local:UtcToLocalDateTimeConverter x:Key="UtcToLocalDateTimeConverter" /> 
</Window.Resources> 
... 
<TextBlock Text="{Binding Submitted, Converter={StaticResource UtcToLocalDateTimeConverter}}" /> 
+0

从数据库加载日期时间时,我没有做任何事情,我刚刚使用EntityFramework ModelFirst实体。也许我需要重写该属性。 – BenCr

+0

@BenCr好吧,你可以做同样的事情,我在转换器中的属性获得者。我会在一秒内编辑我的答案 – Viv

+1

没有必要,我可以淘汰一个转换器,我只是不想沿着这条将它添加到每个绑定中的日期的路径。我希望XAML引擎中的某些内容可以根据当前的UI文化设置格式化日期。 – BenCr