Перетворення рядка в DateTime


590

Як перетворити такий рядок, як, наприклад, 2009-05-08 14:40:52,531в a DateTime?


2
@dban Чому відповідь від @CMSне позначено як відповідь? Можливо, є причина - мені цікаво.
наз

5
@nam Користувач видалив свій обліковий запис або його заборонили, не може натискати на нього, а також не бачити репутацію / медалі. На жаль, ми можемо зробити трохи пальців.
YumeYume

Відповіді:


753

Оскільки ви обробляєте цілодобовий час і у вас є кома, що розділяє секунду, я рекомендую вказати спеціальний формат:

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

4
Гарні очі. Я не бачив коми в ОП.
лк.

(Думаю, ви мали намір використовувати кому в рядках дати та формату, правда, правда?)
lc.

1
Це лише кома через налаштування Європейського локального моменту OP. Що робити, якщо ви перенесете цей код на інший сервер із US.Locale, то дроби розділу будуть десятковими, а не комою на збереженому рядку, і ваше рішення буде перерва. Переконайтесь, що ви додали чек на тип вхідного рядка дати для правильного локального рівня, перш ніж застосувати правильний аналізатор. Я здивований , що Microsoft вже не має цей код prebuild де -небудь ще в CLR або C # .net
Хеміш

не в змозі перетворити цей рядок часу на дату MyString = "22.06.1916 15:20:14";
Вінод Кумар

Цілодобовий час і кома як десятковий роздільник - це не власна мова. З нею не потрібно звертатися спеціально.
jpaugh

248

У вас є два варіанти для цього. DateTime.Parse()і DateTime.ParseExact().

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

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 є таким чином, віддаючи перевагу FP над OOP або навпаки. Ні правильним, ні неправильним. Це вибір. @YoushaAleayoub
guneysus

23

Я пробував різні способи. Що для мене спрацювало:

Convert.ToDateTime(data, CultureInfo.InvariantCulture);

data для мене були такі часи, як 24.09.2017 9:31:34


Виглядає краще, чи можете призначити його значення змінній DateTime?
Бірхан Нега

20

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

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

1
Ніхто не згадував, що це працює лише у цьому конкретному форматі.
T.Todua

Шкода ... 🙂 Кодери завжди думають, що товариші-кодери розберуться ... Добре, що насправді ... Змусимо думати більше ...
Кришна


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
Ви пропустили частину часу? Мені потрібні і дата, і час. Як це зробити?
Бадхон Джайн

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 - це об'єкт, який зберігається як номер всередині рамки, Формат застосовується до нього лише тоді, коли ви перетворюєте його назад у рядок.

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

  • Форматування перетворення внутрішнього числового значення в читаний рядок.

Нещодавно у мене виникла проблема, коли я намагався перетворити DateTime, щоб передати Linq, те, чого я тоді не зрозумів, що формат не має значення при передачі DateTime на запит 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

Різні культури світу пишуть рядки дат по-різному. Наприклад, у США 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

Ти хочеш цього швидко?

Скажімо, у вас є дата з форматом 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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.