2013-06-04 19 views
11

私のアプリケーションは、いくつかの異なるデバイス間でデータを同期します。このため、異なるタイムゾーンに設定されている可能性のある異なるデバイスを考慮して、すべての日付をUTCタイムゾーンに格納します。WPF/XAMLでローカルタイムゾーンで時間を表示

問題は、日付を読み込んで表示すると、間違っているように見えます(ほとんどのユーザーは英国夏時間のため、1時間遅れている)。

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

UIスレッドのSet 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:データベースからのDateTimeをロードするときに、私は何もしていないよ

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

、 EntityFramework ModelFirstエンティティを使用しています。おそらく、私はそのプロパティをオーバーライドする必要があります。 – BenCr

+0

@BenCrあなたは、私がコンバータのプロパティゲッタに持っていたものと同じことをすることができます。私は答えを1秒で編集します – Viv

+1

必要はありません、私はコンバータをノックアウトすることができます、私はちょうどその中の日付を持つすべてのバインディングにそれを追加するその道を行くことを望んでいませんでした。 XAMLエンジンの何かが現在のUIカルチャ設定に従って日付をフォーマットすることを期待していました。 – BenCr