DateTime.ToString(“ MM / dd / yyyy HH:mm:ss.fff”)は、「09/14/2013 07.20.31.371」のような結果になります


131

現在の時刻を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サービスで問題が発生します。

文化フォーマットの問題があるからですか?結果の文字列がドットではなくコロンで区切られていることを確認するにはどうすればよいですか?


2
唯一の違いは、コロンとドットです。
Eldorado

回答:


244

文化フォーマットの問題があるからですか?

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

結果の文字列がドットではなくコロンで区切られていることを確認するにはどうすればよいですか?

以下を指定することをお勧めし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");

これはよりグローバルに受け入れられている形式です。並べ替えも可能で、月と日の順序がわかりやすくなります。(2013年6月7日は、読者の文化に応じて6月7日または7月6日と解釈されます。)


ジョンに感謝します。結果の文字列はフォーマット文字列とまったく同じだと思いました。私はあなたの提案を試みます。
Eldorado

3
ほんの小さな考慮事項。特定のコードからCultureInfoオブジェクトを読み込むときは、常にuseUserOverrideパラメーターをfalse に設定することをお勧めします。そうしないと、一部のユーザー設定がカルチャー設定を上書きする可能性があります。たとえば、あなたの場合、私はnewを使用することをお勧めしますCultureInfo("ar-SA", false)
Davide Icardi 2013年

@DavideIcardi:おもしろい、ありがとう-この場合、サウジアラビアを使用する目的は、なぜインバリアントカルチャを使用することがおそらく正しいのかを具体的に述べることでした。ただし、今後の投稿ではそれを念頭に置いてください。
Jon Skeet、2013年

7
この広範な答えの途中で、私は疑問に思い始めました:これは再びジョンですか?うん。
絶望のしかめっ面2013

Html.TextBoxFor(x => x.Date、 "{0:MM / dd / yyyy}")で同じように管理する方法は?
VISHMAY 2016

9

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

\それをエスケープするために使用します:

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

または使用CultureInfo.InvariantCulture

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

私も2番目のものを使用することをお勧めします/これも特別な意味があるため(これは日付区切り記号です)、問題が発生する可能性もあります。


2
日付の区切り文字だけが問題ではありません。実際の数値に影響を与える文化の例については、私の回答も参照してください...
Jon Skeet

1
\逃げられない!
Shereef Marzouk 2017年

8

ユーザーはコロンの代わりにドットを使用するカルチャに属している必要があるため、InvariantCultureを使用できます。

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

7

私は最近、Windows 10で別の方向からこの問題にぶつかり、@ JonSkeetからの回答が私の問題の解決に非常に役立つことがわかりました。

また、テストフォームを使用してさらに調査を行ったところ、現在のカルチャが設定されている"no""nb-NO"、実行時に(Thread.CurrentThread.CurrentCulture = new CultureInfo("no");)、ToString( "yyyy-MM-dd HH:mm:ss")呼び出しがWindows 7とWindows10。Windows7とWindows 10のHH.mm.ssで期待した結果が返されました。

これはちょっと怖いと思います!私はカルチャーは少なくともWindowsバージョンのカルチャーであると信じていたので。


何が本当にこれを引き起こしているのかを知りたいと思います。
Lauri Peltonen

2
これは、Windows 10の位置特定バグとして認識され、修正されました。したがって、クライアントマシンでWindowsをアップデートすると、問題が解決します。詳細は、このブログの記事でご利用いただけます: heikniemi.net/hardcoded/2015/08/...
ホーコンSeljåsen

上記にリンクしたJouni Heikniemiのブログが壊れているようです。問題が修正された関連するWindows更新がそこにリストされました:2015-10-09:KB3093266 – Windows 10 KB3088956 – Windows Server 2012 R2およびWindows 8.1 KB3088955 – Windows Server 2012およびWindows 8 KB3088957 – Windows 7 SP1、Windows Server 2008 SP2 、Windows Server 2008のR2 SP1、およびWindows Vista SP2再びブログへのリンクしようとしています。ただし、ここではarchive.org:web.archive.org/web/20161030193739/http://www.heikniemi.net/...
ホーコンSeljåsen

4

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"

0

日付を文字列に変換

名前空間を使用

using System.Globalization;

コード

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

これは、日付を文字列に変換する方法ではありません。解析は逆です!
Vincent Vancalbergh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.