文字列をDateTimeに変換する


590

どのように次のような文字列を変換します2009-05-08 14:40:52,531DateTime


2
@dbanからの応答が@CMS回答としてマークされていないのはなぜですか?理由があるかもしれません-興味があります。
ナム

5
@namユーザーが自分のアカウントを削除したか、禁止されたため、アカウントをクリックしたり、評判/メダルを表示したりできません。悲しいことに、私たちにできることは彼に親指をあきらめることだけです。
YumeYume 2017

回答:


753

24時間ベースの時間を処理していて、秒の端数をコンマで区切っているので、カスタム形式を指定することをお勧めします。

DateTime myDate = DateTime.ParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff",
                                       System.Globalization.CultureInfo.InvariantCulture);

4
いい目。OPにコンマがありませんでした。
lc。

(ただし、日付と書式文字列にコンマを使用するつもりだったと思いますよね?)
lc。

1
OPs European Locale設定のため、コンマのみです。そのコードをUS.Localeを使用して別のサーバーに移動すると、セクションの端数は保存された文字列のコンマではなく10進数になり、ソリューションはブレーク。正しいパーサーを適用する前に、正しいロケールの受信日時文字列のタイプのチェックを必ず追加してください。MicrosoftがこのコードをCLRまたはC#.netの他の場所に事前ビルドしていないことに驚いています
2014

これを日付時刻文字列に変換できませんMyString = "06/22/1916 3:20:14 PM";
Vinod Kumar

24時間形式の時刻と小数点記号としてのカンマはカスタムロケールではありません。特別に処理する必要はありません。
jpaugh 2018

248

これには基本的に2つのオプションがあります。DateTime.Parse()DateTime.ParseExact()

1つ目は構文の面で非常に寛容であり、さまざまな形式で日付を解析します。さまざまな形式のユーザー入力に適しています。

ParseExactを使用すると、解析に使用する日付文字列の正確な形式を指定できます。文字列が常に同じ形式である場合は、これを使用することをお勧めします。このようにして、予想されるデータからの逸脱を簡単に検出できます。

次のようにユーザー入力を解析できます。

DateTime enteredDate = DateTime.Parse(enteredString);

文字列に特定の形式がある場合は、他の方法を使用する必要があります。

DateTime loadedDate = DateTime.ParseExact(loadedString, "d", null);

"d"は短い日付パターン(詳細についてはMSDNを参照)を表しnull、現在のカルチャを文字列の解析に使用することを指定します。


137

これを試して

DateTime myDate = DateTime.Parse(dateString);

より良い方法はこれです:

DateTime myDate;
if (!DateTime.TryParse(dateString, out myDate))
{
    // handle parse failure
}


26

拡張メソッドを実装した人はいません。助けを借りてCMSの答え@

機能し改善された完全なソースの例はここにあります:Gist Link

namespace ExtensionMethods {
    using System;
    using System.Globalization;

    public static class DateTimeExtensions {
        public static DateTime ToDateTime(this string s, 
                  string format = "ddMMyyyy", string cultureString = "tr-TR") {
            try {
                var r = DateTime.ParseExact(
                    s: s,
                    format: format,
                    provider: CultureInfo.GetCultureInfo(cultureString));
                return r;
            } catch (FormatException) {
                throw;
            } catch (CultureNotFoundException) {
                throw; // Given Culture is not supported culture
            }
        }

        public static DateTime ToDateTime(this string s, 
                    string format, CultureInfo culture) {
            try {
                var r = DateTime.ParseExact(s: s, format: format, 
                                        provider: culture);
                return r;
            } catch (FormatException) {
                throw;
            } catch (CultureNotFoundException) {
                throw; // Given Culture is not supported culture
            }

        }

    }
}

namespace SO {
    using ExtensionMethods;
    using System;
    using System.Globalization;

    class Program {
        static void Main(string[] args) {
            var mydate = "29021996";
            var date = mydate.ToDateTime(format: "ddMMyyyy"); // {29.02.1996 00:00:00}

            mydate = "2016 3";
            date = mydate.ToDateTime("yyyy M"); // {01.03.2016 00:00:00}

            mydate = "2016 12";
            date = mydate.ToDateTime("yyyy d"); // {12.01.2016 00:00:00}

            mydate = "2016/31/05 13:33";
            date = mydate.ToDateTime("yyyy/d/M HH:mm"); // {31.05.2016 13:33:00}

            mydate = "2016/31 Ocak";
            date = mydate.ToDateTime("yyyy/d MMMM"); // {31.01.2016 00:00:00}

            mydate = "2016/31 January";
            date = mydate.ToDateTime("yyyy/d MMMM", cultureString: "en-US"); 
            // {31.01.2016 00:00:00}

            mydate = "11/شعبان/1437";
            date = mydate.ToDateTime(
                culture: CultureInfo.GetCultureInfo("ar-SA"),
                format: "dd/MMMM/yyyy"); 
         // Weird :) I supposed dd/yyyy/MMMM but that did not work !?$^&*

            System.Diagnostics.Debug.Assert(
               date.Equals(new DateTime(year: 2016, month: 5, day: 18)));
        }
    }
}

Nobody seems to implemented an extension method多分必要ないので...
Yousha Aleayoub

標準アートライブラリがニーズに合わない場合があります。そして、これがヘルパーライブラリを必要とする理由です。拡張メソッドの方法、または流暢なAPIを使用すると、OOPよりもFPが優先されます。逆も同様です。どちらも正しいか間違っています。それは選択です。@YoushaAleayoub
guneysus

23

いろいろ試してみました。私のために働いたのはこれでした:

Convert.ToDateTime(data, CultureInfo.InvariantCulture);

data 私にとってはこのような時間でした2017/09/24 9:31:34 AM


よく見えますが、その値をDateTime変数に割り当てることができますか?
ビルハンネガ

20

以下を試してください。strDateは「MM / dd / yyyy」形式の日付です

var date = DateTime.Parse(strDate,new CultureInfo("en-US", true))

1
その特定のフォーマットでのみ機能するとは誰も述べていません。
T.Todua 2017

残念...🙂コーダーは常に仲間のコーダーが理解するだろうと考えています...実際に良いこと...私たちにもっと考えさせます...
Krishna


15
string input;
DateTime db;
Console.WriteLine("Enter Date in this Format(YYYY-MM-DD): ");
input = Console.ReadLine();
db = Convert.ToDateTime(input);

//////// this methods convert string value to datetime
///////// in order to print date

Console.WriteLine("{0}-{1}-{2}",db.Year,db.Month,db.Day);

1
時間の部分を見逃しましたか?日付と時刻の両方が必要ですが、どうすればよいですか?
Badhon Jain

15

DateTime.Parse

構文:

DateTime.Parse(String value)
DateTime.Parse(String value, IFormatProvider provider)
DateTime.Parse(String value, IFormatProvider provider, DateTypeStyles styles)

例:

string value = "1 January 2019";
CultureInfo provider = new CultureInfo("en-GB");
DateTime.Parse(value, provider, DateTimeStyles.NoCurrentDateDefault););
  • 値:日付と時刻の文字列表現。
  • プロバイダー:カルチャー固有の情報を提供するオブジェクト。
  • スタイル:一部の日付と時刻の解析メソッドの文字列解析をカスタマイズするフォーマットオプション。たとえば、AllowWhiteSpacesは、解析中に文字列に存在するすべてのスペースを無視するのに役立つ値です。

DateTimeはフレームワークの内部で数値として保存されるオブジェクトであることを覚えておく価値もあります。Formatは、文字列に変換し直すときにのみ適用されます。

  • 文字列を内部の数値型に変換する解析。

  • 内部数値を読み取り可能な文字列に変換するフォーマット。

最近、DateTimeをLinqに渡す際に、Linqクエリに渡す際にフォーマットが無関係であることに気づかなかった、Linqに渡す際に問題が発生しました。

DateTime SearchDate = DateTime.Parse(searchDate);
applicationsUsages = applicationsUsages.Where(x => DbFunctions.TruncateTime(x.dateApplicationSelected) == SearchDate.Date);

完全なDateTimeドキュメント


14

入力値がわからない場合は、以下のようにDateTime.TryParseExact()を使用することもできます。

DateTime outputDateTimeValue;
if (DateTime.TryParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out outputDateTimeValue))
{
    return outputDateTimeValue;
}
else
{
    // Handle the fact that parse did not succeed
}

2

このコードを静的クラスに入れます> public static class ClassName{ }

public static DateTime ToDateTime(this string datetime, char dateSpliter = '-', char timeSpliter = ':', char millisecondSpliter = ',')
{
   try
   {
      datetime = datetime.Trim();
      datetime = datetime.Replace("  ", " ");
      string[] body = datetime.Split(' ');
      string[] date = body[0].Split(dateSpliter);
      int year = date[0].ToInt();
      int month = date[1].ToInt();
      int day = date[2].ToInt();
      int hour = 0, minute = 0, second = 0, millisecond = 0;
      if (body.Length == 2)
      {
         string[] tpart = body[1].Split(millisecondSpliter);
         string[] time = tpart[0].Split(timeSpliter);
         hour = time[0].ToInt();
         minute = time[1].ToInt();
         if (time.Length == 3) second = time[2].ToInt();
         if (tpart.Length == 2) millisecond = tpart[1].ToInt();
      }
      return new DateTime(year, month, day, hour, minute, second, millisecond);
   }
   catch
   {
      return new DateTime();
   }
}

このようにして、

string datetime = "2009-05-08 14:40:52,531";
DateTime dt0 = datetime.TToDateTime();

DateTime dt1 = "2009-05-08 14:40:52,531".ToDateTime();
DateTime dt5 = "2009-05-08".ToDateTime();
DateTime dt2 = "2009/05/08 14:40:52".ToDateTime('/');
DateTime dt3 = "2009/05/08 14.40".ToDateTime('/', '.');
DateTime dt4 = "2009-05-08 14:40-531".ToDateTime('-', ':', '-');

2

私はエレガントな方法を見つけました:

Convert.ChangeType("2020-12-31", typeof(DateTime));

Convert.ChangeType("2020/12/31", typeof(DateTime));

Convert.ChangeType("2020-01-01 16:00:30", typeof(DateTime));

Convert.ChangeType("2020/12/31 16:00:30", typeof(DateTime), System.Globalization.CultureInfo.GetCultureInfo("en-GB"));

Convert.ChangeType("11/شعبان/1437", typeof(DateTime), System.Globalization.CultureInfo.GetCultureInfo("ar-SA"));

Convert.ChangeType("2020-02-11T16:54:51.466+03:00", typeof(DateTime)); // format: "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz"

1

世界のさまざまな文化では、さまざまな方法で日付文字列を記述しています。たとえば、米国では2008年1月20日は2008年1月20日です。フランスでは、InvalidFormatExceptionがスローされます。これは、フランスが日付/時刻を日/月/年として読み取り、米国では月/日/年であるためです。

その結果、20/01/2008のような文字列は、フランスでは2008年1月20日に解析され、米国ではInvalidFormatExceptionをスローします。

現在のカルチャ設定を確認するには、System.Globalization.CultureInfo.CurrentCultureを使用できます。

string dateTime = "01/08/2008 14:50:50.42";  
        DateTime dt = Convert.ToDateTime(dateTime);  
        Console.WriteLine("Year: {0}, Month: {1}, Day: {2}, Hour: {3}, Minute: {4}, Second: {5}, Millisecond: {6}",  
                          dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, dt.Millisecond);  


-1

早くしますか?

yyMMdd形式の日付があるとします。

私が見つけたそれを変換する最も速い方法は:

var d = new DateTime(
(s[0] - '0') * 10 + s[1] - '0' + 2000, 
(s[2] - '0') * 10 + s[3] - '0', 
(s[4] - '0') * 10 + s[5] - '0')

選択した日付形式に応じてインデックスを選択してください。速度が必要な場合は、おそらく関数の「一般的でない」方法を気にしないでしょう。

この方法では、次の場合に必要な時間の約10%がかかります。

var d = DateTime.ParseExact(s, "yyMMdd", System.Globalization.CultureInfo.InvariantCulture);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.