現在の時刻を Web サービスに送信する WP8 アプリがあります。
呼び出して日時文字列を取得します
DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff")
ほとんどのユーザーにとって、これはうまく機能し、 のような正しい文字列を返します"09/10/2013 04:04:31.415"
。しかし、一部のユーザーの場合、結果の文字列は のようなものになり"09/14/2013 07.20.31.371"
、Web サービスで問題が発生します。
何らかの文化形式の問題が原因でしょうか? 結果の文字列がドットではなくコロンで区切られていることを確認するにはどうすればよいですか?
ベストアンサー1
それは何らかの文化形式の問題によるものでしょうか?
はい。ユーザーは、時刻区切りがドットである文化に属している必要があります。「:」と「/」はどちらも、文化に応じて解釈されます。カスタム日付と時刻の形式。
結果の文字列がドットではなくコロンで区切られていることを確認するにはどうすればよいですか?
以下を指定することをお勧めしますCultureInfo.InvariantCulture
:
string text = dateTime.ToString("MM/dd/yyyy HH:mm:ss.fff",
CultureInfo.InvariantCulture);
あるいは、できた時間と日付の区切り文字を引用符で囲むだけです:
string text = dateTime.ToString("MM'/'dd'/'yyyy HH':'mm':'ss.fff");
... しかし、デフォルトのカレンダー システムがグレゴリオ暦ではない文化でユーザーを実行している場合、おそらく予想外の「興味深い」結果が得られます。たとえば、次のコードを見てみましょう。
using System;
using System.Globalization;
using System.Threading;
class Test
{
static void Main()
{
DateTime now = DateTime.Now;
CultureInfo culture = new CultureInfo("ar-SA"); // Saudi Arabia
Thread.CurrentThread.CurrentCulture = culture;
Console.WriteLine(now.ToString("yyyy-MM-ddTHH:mm:ss.fff"));
}
}
これにより、次の出力が生成されます (2013 年 9 月 18 日現在)。
11/12/1434 15:04:31.750
おそらくあなたの Web サービスはこれに驚くでしょう!
私は実際には不変文化を使用するだけでなく、またISO-8601 日付形式に変更します。
string text = dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff", CultureInfo.InvariantCulture);
これはより世界的に受け入れられている形式です。並べ替えも可能で、月と日の順序が明確になります。(一方、06/07/2013 は、読者の文化によっては 6 月 7 日または 7 月 6 日と解釈される可能性があります。)