User1454 Ответов: 3

Преобразование строки в дату и время в C#


Привет,
Мне нужно преобразовать формат даты и времени : 'Tue Aug 9 00:00:03 2016' к '2016-08-09 00:00:03Я попробовал это нижеприведенное решение, но ничего не вышло. Пожалуйста, помогите мне для преобразования в 'yyyy-MM-dd HH:mm:ss' формат. Заранее спасибо.

Что я уже пробовал:

private string ParseDateTime(string dateTime)
        {
            try
            {
                DateTime dateValue; string UTC_DateTime = "";
                if (DateTime.TryParse(dateTime, out dateValue))
                {
                    UTC_DateTime = dateValue.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss");
                }
                else
                {
                    var date = DateTime.ParseExact(dateTime, "ddd MMM dd HH:mm:ss yyyy", CultureInfo.GetCultureInfo("en-us"));
                   UTC_DateTime = date.ToString("yyyy-MM-dd HH:mm:ss");
                }
                return UTC_DateTime;
            }
            catch (Exception ex)
            {
              return "";
            }      
        }

Maciej Los

А что не так с вашим кодом?

3 Ответов

Рейтинг:
2

Maciej Los

Прежде всего: а 'Tue Aug 9 00:00:03 2016' дата не могу быть преобразованным в '2016-10-09 00:00:03', потому что из-за Августа это 8. месяц в году.

Во-вторых, все, что вам нужно сделать, это:

string inputDate = "Tue Aug 9 00:00:03 2016";
string inputFormat = "ddd MMM d hh:mm:ss yyyy";
System.Globalization.CultureInfo provider = new System.Globalization.CultureInfo("en-US");

DateTime resultDate = DateTime.ParseExact(inputDate, inputFormat, provider);
//resultDate = '2016-08-09 00:00:03'


Но (!), я бы предложил использовать значение datetime.Метод tryparse[^] или значение datetime.Метод tryparseexact[^] метод.

DateTime resultDate1;

if (DateTime.TryParseExact(inputDate, inputFormat, provider, System.Globalization.DateTimeStyles.None, out resultDate1))
{
	Console.WriteLine("A result date is '{0}'", resultDate1);
}
else
{
	Console.WriteLine("String to date conversion failed!");
}


[РЕДАКТИРОВАТЬ]
С помощью DateTime.TryParseExact, вы можете перебирать множество форматов, т. е.:

string inputDate = "Tue Aug 10 00:00:03 2016"; //'2016-10-09 00:00:03'.
string[] inputFormats = new string[] {"MMM d hh:mm:ss yyyy", "MMM dd hh:mm:ss yyyy"};
System.Globalization.CultureInfo provider = new System.Globalization.CultureInfo("en-US");

DateTime resultDate = new DateTime(1900,1,1);

foreach(string format in inputFormats)
{
	if (DateTime.TryParseExact(inputDate.Substring(4,inputDate.Length-4), format, provider, System.Globalization.DateTimeStyles.None, out resultDate))
	{
		Console.WriteLine("A result date is '{0}'", resultDate);
		break;
	}
} 


if(resultDate==new DateTime(1,1,1))
{
	Console.WriteLine("String to date conversion failed. Unknown format!");
}


Karthik_Mahalingam

а как насчет входной строки в
1) Tue Aug 9 00:00:03 2016
2) Tue Aug 10 00:00:03 2016

Maciej Los

См. обновленный ответ.

Karthik_Mahalingam

Мацей,
извините, это выглядит сложным и использующим петля- неубедительно.
однако его до OP.

Maciej Los

Ну, как я уже упоминал, есть несколько способов достичь этого...
Ура!
Мацей

Karthik_Mahalingam

хм! овации
:)

4, за ваши усилия

Maciej Los

Спасибо, Картик

Karthik_Mahalingam

туалет :)

Maciej Los

Надеюсь, вы имеете в виду ВэльСОме...
Это забавно, потому что WC в Польше означает: туалеты ;)

Karthik_Mahalingam


ВэльСОме сэр
в дальнейшем я буду использовать полный текст.
лол.

Karthik_Mahalingam

Прежде всего:дата' Tue Aug 9 00:00:03 2016 'не может быть преобразована в' 2016-10-09 00:00: 03', потому что duu to August-это 8. месяц в году.


я думаю, что его опечатка кстати, об ОП.

Рейтинг:
2

pparya27

Очень простой метод для вашего требования :


/// <summary>
   ///
   /// </summary>
   /// <param name="dateTime">input date format : "ddd MMM d HH:mm:ss yyyy"</param>
   /// <returns>output date format : "yyyy-MM-dd HH:mm:ss"</returns>
   private string ParseDateTime(string dateTime)
   {
       DateTime dateValue;
       string UTC_DateTime = "";
       try
       {
           //Tue Aug 9 00:00:03 2016  |  2016-08-09 00:00:03
           dateValue = DateTime.ParseExact(dateTime, "ddd MMM d HH:mm:ss yyyy", CultureInfo.InvariantCulture);
           UTC_DateTime = dateValue.ToString("yyyy-MM-dd HH:mm:ss");
           return UTC_DateTime;
       }
       catch (Exception ex)
       {
           return "";
       }
   }


Maciej Los

Пожалуйста, прочтите комментарии к моему ответу. Вы должны избегать возвращать строку вместо DateTime.

Рейтинг:
17

Karthik_Mahalingam

Добавьте эти строки,

private static string ParseDateTime(string dateTime)
      {
          var parts = dateTime.Split(' ');
          var day = parts[2];
          var validDay = day.Length == 1 ? "0" + day : day;
          dateTime = dateTime.Replace(" " + day + " ", " " + validDay + " ");

          try
          {


То день вы проходите внутрь "d" формат, но вы есть разбор в "dd" формат, поэтому он должен быть хорошо отформатирован, чтобы dd для однозначных чисел путем сложения 0 около prefix


User1454

Огромное спасибо!!! Это сработало . Изменено на
var parts = dateTime.Расщеплять(' ');
var day = части[2];
var validDay = день.Длина = = 1 ? "0" + день : день;
датавремя = датавремя.Заменить (""+ day + "", "" + validDay + " ");
dateValue = DateTime.ParseExact(dateTime, "ddd MMM dd HH:mm:ss yyyy", null);
UTC_DateTime = датазнач.ToString ("yyyy-MM-dd HH:mm:ss");

Karthik_Mahalingam

крутой

Maciej Los

Извини, Картик, но это решение есть... низкое качество.
Пожалуйста, посмотрите мой ответ.

Karthik_Mahalingam

Привет Мацей
я знал, что это не идеальное решение, но как справиться с днем, когда меньше 10 и больше 9 ?

Maciej Los

Ничего ;)
Обойти его довольно просто. Я обновлю свой ответ через несколько минут.

Karthik_Mahalingam

ладно :)

Karthik_Mahalingam

несколько минут над ;)

User1454

Спасибо Maciej Los, код, который я пробовал ранее, выдает ошибку недопустимого формата даты и времени из-за двузначного месяца, пытающегося разобрать с помощью 'd' in dd MMM d hh:mm:ss yyyy. Как только он был дополнен " 0 "и использовал "dd", он отлично работает. Кроме того, он работал с "нулем" вместо другой специфичной для культуры информации.