необходимо преобразовать & ldquo; 19920718 & rdquo; этот формат String to date C # [дубликат]

import pathlib

current_dir = pathlib.Path(__file__).parent
current_file = pathlib.Path(__file__)

Doc ref: ссылка

118
задан Matt 20 June 2018 в 07:18
поделиться

7 ответов

DateTime.Parse() попытается определить формат данной даты, и обычно это хорошо работает. Если вы можете гарантировать, что даты всегда будут в определенном формате, вы можете использовать ParseExact():

string s = "2011-03-21 13:26";

DateTime dt = 
    DateTime.ParseExact(s, "yyyy-MM-dd HH:mm", CultureInfo.InvariantCulture);

(Но обратите внимание, что обычно безопаснее использовать один из методов TryParse в случае, если дата не в ожидаемом формате)

При построении строки формата убедитесь, что Пользовательские строки даты и времени , особенно обратите внимание на количество букв и регистра (т. е. «ММ» и [mm] - это разные вещи.

Другим полезным ресурсом для строк формата C # является Форматирование строк в C #

193
ответ дан Mitch Wheat 16 August 2018 в 02:04
поделиться
  • 1
    Коррекция - ВСЕГДА безопаснее;) Если вы вызываете метод с исключением, всегда проверяйте условие исключения, если это возможно. – Gusdor 27 August 2013 в 13:36
  • 2
    Я бы сказал, что безопаснее всегда передавать свою культуру. Я предпочел бы исключение, чем «01-02-2013». быть неверным истолкованием либо вторым января, либо первым февраля. – Carra 14 October 2013 в 09:38
  • 3
    @Carra: даты в формате ISO8601 (т. Е. Yyyy-mm-dd) всегда интерпретируются правильно. Именно поэтому мы используем даты формата ISO8601 ... – Mitch Wheat 16 July 2014 в 03:41
  • 4
    Точный анализ может быть полезен. Иногда я бы предпочел, чтобы мой крах приложения и мой компьютер загорелись, в отличие от создания неправильного вывода. Зависит от приложения. – Allen 31 July 2015 в 18:03
  • 5
    ParseExact отлично, потому что он является гибким, но имеет недостаток: обратите внимание, что методы ParseExact и Parse генерируют исключения, если в формате даты переменной s есть синтаксическая ошибка. Следовательно, лучше использовать TryParseExcact. Я указал, почему в моем ответе ниже. – Matt 4 September 2015 в 13:11

Вы также можете использовать XmlConvert.ToDateString

var dateStr = "2011-03-21 13:26";
var parsedDate = XmlConvert.ToDateTime(dateStr, "yyyy-MM-dd hh:mm");

Хорошо указать тип даты, код:

var anotherParsedDate = DateTime.ParseExact(dateStr, "yyyy-MM-dd hh:mm", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);

Подробнее о различных параметрах разбора http://amir-shenodua.blogspot.ie/2017/06/datetime-parsing-in-net.html

1
ответ дан Andrea Perelli 16 August 2018 в 02:04
поделиться

DateTime.Parse () должен отлично работать для этого формата строки. Ссылка:

http://msdn.microsoft.com/en-us/library/1k1skd40.aspx#Y1240

Выбрасывает исключение FormatException для вы?

4
ответ дан cacois 16 August 2018 в 02:04
поделиться
var dateStr = @"2011-03-21 13:26";
var dateTime = DateTime.ParseExact(dateStr, "yyyy-MM-dd HH:mm", CultureInfo.CurrentCulture);

Проверьте эту ссылку для других строк формата!

12
ответ дан DatRid 16 August 2018 в 02:04
поделиться

Как я объясняю позже, я всегда предпочитаю методы TryParse и TryParseExact. Поскольку они немного громоздки для использования, я написал метод расширения, который упрощает разбор:

var    dtStr = "2011-03-21 13:26";
DateTime? dt = dtStr.toDate("yyyy-MM-dd HH:mm");

В отличие от Parse, ParseExact и т. Д. Он не генерирует исключение и позволяет вы проверите через

if (dt.HasValue) { // continue processing } else { // do error handling }

, было ли преобразование успешным (в этом случае dt имеет значение, к которому вы можете получить доступ через dt.Value) или нет (в этом случае , null).

Это даже позволяет использовать элегантные ярлыки, такие как «Elvis» -оператор ?., например:

int? year = dtStr?.toDate("yyyy-MM-dd HH:mm")?.Year;

Здесь вы также можете используйте year.HasValue, чтобы проверить, удалось ли преобразование, и если это не удалось, тогда year будет содержать null, в противном случае - годовую часть даты. Если преобразование не сработало, нет никакого исключения.

Попробуйте в .NetFiddle

public static class Extensions
{
    public static DateTime? toDate(this string dateTimeStr, string[] dateFmt)
    {
      // example: var dt = "2011-03-21 13:26".toDate(new string[]{"yyyy-MM-dd HH:mm", 
      //                                                  "M/d/yyyy h:mm:ss tt"});
      const DateTimeStyles style = DateTimeStyles.AllowWhiteSpaces;
      if (dateFmt == null)
      {
        var dateInfo = System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat;
        dateFmt=dateInfo.GetAllDateTimePatterns();
      }
      DateTime? result = null;
      DateTime dt;
      if (DateTime.TryParseExact(dateTimeStr, dateFmt,
         CultureInfo.InvariantCulture, style, out dt)) result = dt;
      return result;
    }

    public static DateTime? toDate(this string dateTimeStr, string dateFmt=null)
    {
      // example:   var dt="2011-03-21 13:26".toDate("yyyy-MM-dd HH:mm");
      // or simply  var dt="2011-03-21 13:26".toDate();        
      // call overloaded function with string array param
      string[] dateFmtArr = dateFmt == null ? null : new string[] { dateFmt };
      return toDate(dateTimeStr, dateFmtArr);
    }
}

Обновление: .toDate() (без параметров) теперь по умолчанию ко всем общим шаблонам даты / времени текущей культуры потока. Заметим, что нам нужны result и dt вместе, потому что TryParseExact не позволяет использовать DateTime?, который мы намерены вернуть. В C # Version 7 вы можете немного упростить функцию toDate следующим образом:

 // in C#7 only: "DateTime dt;" - no longer required, declare implicitly
 if (DateTime.TryParseExact(dateTimeStr, dateFmt,
     CultureInfo.InvariantCulture, style, out var dt)) result = dt;

(Также будет разрешено писать out DateTime dt вместо out var dt.)

Пример:

var dtStr="2011-03-21 13:26";    
var dt=dtStr.toDate("yyyy-MM-dd HH:mm");
if (dt.HasValue)
{
    Console.WriteLine("Successful!");
    // ... dt.Value now contains the converted DateTime ...
}
else
{
    Console.WriteLine("Invalid date format!");
}

Как вы можете видеть, этот пример просто запрашивает dt.HasValue, чтобы узнать, было ли преобразование успешным или нет. В качестве дополнительного бонуса TryParseExact позволяет указать строгую DateTimeStyles, чтобы вы точно знали, была ли передана правильная дата / время.


N.B. Перегруженная функция позволяет вам передать массив допустимых форматов, используемых для парсинга / преобразования дат, как показано здесь здесь (TryParseExact прямо поддерживает это), например

string[] dateFmt = {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt", 
                     "MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss", 
                     "M/d/yyyy hh:mm tt", "M/d/yyyy hh tt", 
                     "M/d/yyyy h:mm", "M/d/yyyy h:mm", 
                     "MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm"};
var dtStr="5/1/2009 6:32 PM"; 
var dt=dtStr.toDate(dateFmt);

Однако, чтобы сохранить код коротким, я использую только перегрузку строкового массива TryParseExact, потому что он не работает с параметром Generic.

Расширенный пример: вы можете использовать оператор ?? по умолчанию к отказоустойчивому формату, например

var dtStr = "2017-12-30 11:37:00";
var dt = (dtStr.toDate()) ?? dtStr.toDate("yyyy-MM-dd HH:mm:ss");

. В этом случае .toDate() будет использовать общие форматы даты локальной культуры, и если все это не удастся, он попытается использовать ISO стандартный формат "yyyy-MM-dd HH:mm:ss" в качестве резервной копии. Таким образом, функция расширения позволяет легко «сгруппировать» различные резервные форматы.


Наконец, вот некоторые комментарии к фону (то есть причина, по которой я написал это так):

Я предпочитаю TryParseExact в этом методе расширения, потому что вы избегаете обработки исключений - вы можете прочитать статью Эрика Липперта об исключениях , почему вы должны использовать TryParse, а не Parse, я цитирую его об этом тема: 2)

Это неудачное дизайнерское решение1) [аннотация: чтобы метод Parse выкинул исключение] был настолько досадным, что, конечно, команда фреймворков внедрила TryParse вскоре после этого, что делает правильные вещи.

Это так, но TryParse и TryParseExact все еще намного меньше, чем удобно использовать: они заставляют вас использовать неинициализированную переменную в качестве параметра out, который не должен быть нулевым, и при преобразовании вам нужно оценить возвращаемое значение boolean - либо вы должны использовать if sta немедленно, или вам нужно сохранить возвращаемое значение в дополнительной логической переменной, чтобы вы могли выполнить проверку позже. И вы не можете просто использовать целевую переменную, не зная, было ли преобразование успешным или нет.

В большинстве случаев вам просто нужно знать , было ли преобразование успешным или нет (и, конечно, значение, если оно было успешным) , поэтому переменная с нулевым значением, которая сохраняет все информация была бы желательной и намного более изящной, поскольку вся информация просто хранится в одном месте: это непротиворечиво и простота в использовании и гораздо меньше подвержена ошибкам.

Метод расширения, который я написал, что (он также показывает вам, какой код вам придется писать каждый раз, если вы не собираетесь его использовать).

Я считаю, что преимущество .toDate(strDateFormat) в том, что он выглядит простым и чистым - так же просто, как предполагалось, оригинал DateTime.Parse, но с возможностью проверить, было ли преобразование успешным, и без исключений.


1) Что здесь имеется в виду это обработка исключений (т. е. блок try { ... } catch(Exception ex) { ...}), что необходимо, когда вы используете Parse, потому что он будет генерировать исключение, если синтаксический анализ недействительной строки - не только лишний y в этом случае, но также раздражает и усложняет ваш код. TryParse избегает всего этого, как показывает образец кода, который я предоставил.


2) Эрик Липперт - известный сотрудник StackOverflow и работает в Microsoft как основной разработчик в команде компилятора C # в течение нескольких лет.

33
ответ дан Matt 16 August 2018 в 02:04
поделиться

Простой и понятный ответ ->

using System;

namespace DemoApp.App

{
public class TestClassDate
{
    public static DateTime GetDate(string string_date)
    {
        DateTime dateValue;
        if (DateTime.TryParse(string_date, out dateValue))
            Console.WriteLine("Converted '{0}' to {1}.", string_date, dateValue);
        else
            Console.WriteLine("Unable to convert '{0}' to a date.", string_date);
        return dateValue;
    }
    public static void Main()
    {
        string inString = "05/01/2009 06:32:00";
        GetDate(inString);
    }
}
}

/**
 * Output:
 * Converted '05/01/2009 06:32:00' to 5/1/2009 6:32:00 AM.
 * */
0
ответ дан Shivam Bharadwaj 16 August 2018 в 02:04
поделиться

Поместите значение удобочитаемой строки в .NET DateTime с таким кодом:

DateTime.ParseExact("April 16, 2011 4:27 pm", "MMMM d, yyyy h:mm tt", null);
3
ответ дан Zack Peterson 16 August 2018 в 02:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: