引き続き、 VS2015 & C# で UWP を作る場合のトピックを書いておこうという試み
日付などの表示の際に、三文字の英語表記の曜日を取り出そうとしたときの顛末
日付などは Stringの拡張でフォーマットを指定して変換することができます
PHP などでお馴染みの yyyy-MM-dd などの方式で指定する事が出来ますが、やはり MS 仕様なので細かい指定方法は 標準の日時書式指定文字列 などを確認しないと判りません
ココまでは普通だと思います
デフォルトのロケールは、プロジェクトのプロパティーから、パッケージマニュフェストを開いて、アプリケーションの「規定の言語」を確認します
public sealed partial class _XXXXXXXX : INotifyPropertyChanged
{
public string NowTime
{
get;
private set;
}
public string NowDate
{
get;
private set;
}
…
public _XXXXXXXX()
{
Run();
}
…
private async void Run()
{
…
CultureInfo ci = new CultureInfo("en-US");
…
while (true)
{
await Task.Delay(100);
var nowTime = DateTimeOffset.Now;
…
this.NowDate = nowTime.ToString("yyyy-MM-dd ddd",ci);
this.PropertyChanged(this, new PropertyChangedEventArgs("NowDate"));
…
this.NowTime = nowTime.ToString("HH:mm:ss");
this.PropertyChanged(this, new PropertyChangedEventArgs("NowTime"));
…
これは、INotifyPropertyChanged で、プロパティーチェンジのイベントを発生させて UI にバインドしたテキストブロックに時刻を表示する機能を実装してみたんですが、なんとなく動いています
実際は、ディレイをかけて無限ループして、テキストブロックに <TextBlock x:Name="timeBlock" Text="{Binding NowTime}"
こんな指定をすると自動的に時刻の表示を更新してくれます
NowTime の方は、時間なのでロケールごとの表記がある思いますが、文字の幅が任意に変更されてしまうと見栄えが悪くなるので二四時間表記で固定してしまいました
日付も同様に漢字が混ざったり表記が変わったりすると面倒なので、2016-05-26 Thu と表記させて見ました
ddd が曜日へ変換する指定になりますが、ci を指定しないとウィンドウスのコントロールパネルで指定した通り、 金 とかの表示になります
UWP ではロケールをカルチャーと言う様です
なので、文化圏を米国にしたカルチャー情報を作成して、ToString に引数で渡せば良いようです
本当はタイムゾーンの JST 表記も欲しかったのですが、+0900 しかとれとれないようなのであきらめました
時刻の表示は 秒が前回の計測時と変わったら、日付は前回の計測時の分が変わったら更新しています
そんなに頻繁に書き換える必要無いですしね…