it-roy-ru.com

Преобразование строки в DateTime

Как преобразовать строку, такую ​​как 2009-05-08 14:40:52,531, в DateTime?

520
dban

Поскольку вы работаете с 24-часовым временем и у вас есть запятая, отделяющая долю секунд, я рекомендую вам указать собственный формат:

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

У вас есть в основном два варианта для этого. DateTime.Parse() и DateTime.ParseExact().

Первый очень простителен с точки зрения синтаксиса и будет анализировать даты во многих различных форматах. Это хорошо для пользовательского ввода, который может иметь разные форматы.

ParseExact позволит вам указать точный формат вашей строки даты, который будет использоваться для разбора. Это полезно, если ваша строка всегда в одном и том же формате. Таким образом, вы можете легко обнаружить любые отклонения от ожидаемых данных.

Вы можете проанализировать ввод пользователя следующим образом:

DateTime enteredDate = DateTime.Parse(enteredString);

Если у вас есть определенный формат для строки, вы должны использовать другой метод:

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

"d" обозначает шаблон короткой даты (см. MSDN для получения дополнительной информации ), а null указывает, что текущая культура должна использоваться для анализа строки.

229
Sander

попробуй это

DateTime myDate = DateTime.Parse(dateString);

лучший способ был бы такой:

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

Кажется, никто не реализовал метод расширения. С помощью ответ @ 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)));
        }
    }
}
25
guneysus

использовать DateTime.Parse (строка)

DateTime dateTime= DateTime.Parse(dateTimeStr);
23
Amir Twito

Попробуйте ниже, где strDate - ваша дата в формате "MM/dd/yyyy"

var date = DateTime.Parse(strDate,new CultureInfo("en-US", true))
19
Krishna
19
lc.
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);
15
Umair Baig

Я пробовал разные способы. То, что работало для меня, было этим:

Convert.ToDateTime(data, CultureInfo.InvariantCulture);

data для меня было такое время 24.09.2017 9:31:34

15
zeilja

Вы также можете использовать 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
}
14
dev.bv

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 - это объект, который хранится как номер внутри фреймворка. Формат применяется к нему только при преобразовании его обратно в строку.

  • Разбор преобразования строки во внутренний тип номера.

  • Форматирование, преобразовывающее внутреннее числовое значение в читаемую строку.

Недавно у меня возникла проблема, когда я пытался преобразовать DateTime для передачи в Linq, но в то время я не осознавал, что формат не имеет значения при передаче DateTime в запрос Linq.

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

Полная документация DateTime

6
Mr.B

Поместите этот код в статический класс> 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
M.R.T2017

Разные культуры в мире пишут строки дат по-разному. Например, в США 20.01.2008 - 20 января 2008 года. Во Франции это вызовет исключение InvalidFormatException. Это потому, что Франция читает дату-время как День/Месяц/Год, а в США - Месяц/День/Год.

Следовательно, строка, подобная 20.01.2008, будет проанализирована до 20 января 2008 года во Франции, а затем вызовет исключение 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
Saeed Dini