web-dev-qa-db-ja.com

DateTime.ToString( "MM/dd/yyyy HH:mm:ss.fff")の結果、 "09/14/2013 07.20.31.371"のようになりました。

私は現在の時間を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サービスで問題を引き起こします。

文化フォーマットの問題があるからでしょうか。結果文字列がドットではなくコロンで区切られていることを確認する方法を教えてください。

120
Eldorado

文化フォーマットの問題があるからでしょうか。

はい。ユーザーは、時間区切り文字がドットであるカルチャに属している必要があります。 ":"と "/"は両方とも カスタムの日付と時刻の形式 でカルチャ依存の方法で解釈されます。

結果文字列がドットではなくコロンで区切られていることを確認する方法を教えてください。

CultureInfo.InvariantCultureを指定することをお勧めします。

string text = dateTime.ToString("MM/dd/yyyy HH:mm:ss.fff",
                                CultureInfo.InvariantCulture);

別の方法として、あなたはcould時間と日付の区切り文字を単に引用するだけです:

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");

これはより世界的に受け入れられているフォーマットです - それはまたソート可能で、月と日の順序を明白にします。 (2013年6月7日は、読者の文化に応じて6月7日または7月6日と解釈される可能性があります。)

221
Jon Skeet

:は特別な意味を持ちます:それは時間区切り記号カスタムの日付と時刻のフォーマット文字列 )です。

エスケープするには\を使用してください。

DateTime.ToString(@"MM/dd/yyyy HH\:mm\:ss.fff")

またはCultureInfo.InvariantCultureを使用してください。

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture)

/にも特別な意味があるので(日付区切り記号))、2番目のものを使用することをお勧めします。それであなたもそれに関して問題を抱えることができます。

9
MarcinJuraszek

ユーザーはコロンではなくドットを使用するカルチャ内にいる必要があるため、InvariantCultureを使用できます。

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture);
7
Jon La Marr

私は最近、Windows 10でこの問題に 別の方向、 からぶつかって、@ JonSkeetからの答えが私の問題を解決するのに非常に役立つことを発見しました。

また、テストフォームでさらに調査した結果、実行時に現在のカルチャが"no"または"nb-NO"に設定されている場合(Thread.CurrentThread.CurrentCulture = new CultureInfo("no");)、ToString( "yyyy-MM-dd HH:mm:ss")呼び出しの応答が異なることがわかりました。 Windows 7とWindows10。それは私がWindows 7とWindows 10でHH.mm.ssで期待したものを返しました!

これは少し怖いと思います。私は、文化は少なくともどのWindowsバージョンの文化でもあると考えていました。

6

あなたはString.Formatを使うことができます:

DateTime d = DateTime.Now;
string str = String.Format("{0:00}/{1:00}/{2:0000} {3:00}:{4:00}:{5:00}.{6:000}", d.Month, d.Day, d.Year, d.Hour, d.Minute, d.Second, d.Millisecond);
// I got this result: "02/23/2015 16:42:38.234"
3
Cosmin

日付を文字列に変換

名前空間を使用する

using System.Globalization;

コード

string date = DateTime.ParseExact(datetext.Text, "dd-MM-yyyy", CultureInfo.InstalledUICulture).ToString("yyyy-MM-dd");
0
Hafsal