@dban Почему ответ @CMSне помечен как ответ? Может быть причина - мне любопытно.
Nam
5
@nam Пользователь удалил свою учетную запись или был заблокирован, не может кликнуть по ней и не посмотреть репутацию / медали. К сожалению, все, что мы можем сделать, это дать ему несколько больших пальцев.
YumeYume
Ответы:
754
Поскольку вы работаете с 24-часовым временем и у вас есть запятая, разделяющая долю секунд, я рекомендую вам указать пользовательский формат:
(Я думаю, что вы хотели использовать запятую в строках даты и формата, правда?)
lc.
1
Это только запятая из-за настройки европейского языкового стандарта OP, что если вы перенесете этот код на другой сервер с US.Locale, то фракции раздела будут десятичными, а не запятой в сохраненной строке, и ваше решение будет перемена. Убедитесь, что вы добавили проверку типа входящей строки datetime для ее правильного Locale перед применением правильного парсера. Я удивлен, что у Microsoft еще нет этого кода, предварительно скомпилированного где-нибудь еще в CLR или C # .net
хэмиш
невозможно преобразовать это в строку даты и времени MyString = "22.06.1916 3:20:14 PM";
Винод Кумар
24-часовое время и запятая в качестве десятичного разделителя не являются пользовательской локалью. Это не должно быть обработано специально.
jpaugh
248
У вас есть в основном два варианта для этого. DateTime.Parse()и DateTime.ParseExact().
Первый очень простителен с точки зрения синтаксиса и будет анализировать даты во многих различных форматах. Это хорошо для пользовательского ввода, который может прийти в разных форматах.
ParseExact позволит вам указать точный формат вашей строки даты, который будет использоваться для разбора. Это полезно, если ваша строка всегда в одном и том же формате. Таким образом, вы можете легко обнаружить любые отклонения от ожидаемых данных.
Вы можете проанализировать ввод пользователя следующим образом:
Кажется, никто не реализовал метод расширения. С помощью ответа @ CMS :
Рабочий и улучшенный пример с полным исходным кодом находится здесь: Gist Link
namespace ExtensionMethods{
using System;
using System.Globalization;publicstaticclassDateTimeExtensions{publicstaticDateTimeToDateTime(thisstring 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}}publicstaticDateTimeToDateTime(thisstring 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;classProgram{staticvoidMain(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(newDateTime(year:2016, month:5, day:18)));}}}
Nobody seems to implemented an extension methodможет потому что не нужен ...
Юша Алеауб
Иногда стандартная библиотека не соответствует нашим потребностям. И именно поэтому нужны / используются вспомогательные библиотеки. Используя метод расширения или свободный API, вы предпочитаете FP вместо ООП или наоборот. Ни правильно, ни неправильно. Это выбор. @YoushaAleayoub
guneysus
23
Я пробовал разные способы. То, что работало для меня, было этим:
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 dateConsole.WriteLine("{0}-{1}-{2}",db.Year,db.Month,db.Day);
stringvalue="1 January 2019";CultureInfo provider =newCultureInfo("en-GB");DateTime.Parse(value, provider,DateTimeStyles.NoCurrentDateDefault););
Значение: строковое представление даты и времени.
Провайдер: объект, который предоставляет информацию о культуре.
Стили: параметры форматирования, которые настраивают разбор строк для некоторых методов анализа даты и времени. Например, AllowWhiteSpaces - это значение, которое помогает игнорировать все пробелы, присутствующие в строке, во время ее анализа.
Также стоит помнить, что DateTime - это объект, который хранится как номер внутри фреймворка. Формат применяется к нему только при преобразовании его обратно в строку.
Разбор преобразования строки во внутренний тип номера.
Форматирование, преобразовывающее внутреннее числовое значение в читаемую строку.
Недавно у меня возникла проблема, когда я пытался преобразовать DateTime для передачи в Linq, но я не знал, что формат не имеет значения при передаче DateTime в Linq Query.
Вы также можете использовать 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}
Разные культуры мира пишут строки дат по-разному. Например, в США 20.01.2008 - 20 января 2008 года. Во Франции это вызовет исключение InvalidFormatException. Это потому, что Франция читает дату-время как День / Месяц / Год, а в США - Месяц / День / Год.
Следовательно, строка, подобная 20.01.2008, будет проанализирована до 20 января 2008 года во Франции, а затем вызовет исключение InvalidFormatException в США.
Чтобы определить текущие настройки культуры, вы можете использовать System.Globalization.CultureInfo.CurrentCulture.
@CMS
не помечен как ответ? Может быть причина - мне любопытно.Ответы:
Поскольку вы работаете с 24-часовым временем и у вас есть запятая, разделяющая долю секунд, я рекомендую вам указать пользовательский формат:
источник
У вас есть в основном два варианта для этого.
DateTime.Parse()
иDateTime.ParseExact()
.Первый очень простителен с точки зрения синтаксиса и будет анализировать даты во многих различных форматах. Это хорошо для пользовательского ввода, который может прийти в разных форматах.
ParseExact позволит вам указать точный формат вашей строки даты, который будет использоваться для разбора. Это полезно, если ваша строка всегда в одном и том же формате. Таким образом, вы можете легко обнаружить любые отклонения от ожидаемых данных.
Вы можете проанализировать ввод пользователя следующим образом:
Если у вас есть определенный формат для строки, вы должны использовать другой метод:
"d"
обозначает шаблон короткой даты (см. MSDN для получения дополнительной информации ) иnull
указывает, что текущая культура должна использоваться для анализа строки.источник
попробуй это
лучше было бы так:
источник
Используйте
DateTime.Parse(string)
:источник
Кажется, никто не реализовал метод расширения. С помощью ответа @ CMS :
Рабочий и улучшенный пример с полным исходным кодом находится здесь: Gist Link
источник
Nobody seems to implemented an extension method
может потому что не нужен ...Я пробовал разные способы. То, что работало для меня, было этим:
data
для меня было время, как это 24.09.2017 9:31:34источник
Попробуйте ниже, где strDate - ваша дата в формате «MM / dd / yyyy»
источник
Convert.ToDateTime или DateTime.Parse
источник
источник
DateTime.Parse
Синтаксис:
Пример:
Также стоит помнить, что DateTime - это объект, который хранится как номер внутри фреймворка. Формат применяется к нему только при преобразовании его обратно в строку.
Разбор преобразования строки во внутренний тип номера.
Форматирование, преобразовывающее внутреннее числовое значение в читаемую строку.
Недавно у меня возникла проблема, когда я пытался преобразовать DateTime для передачи в Linq, но я не знал, что формат не имеет значения при передаче DateTime в Linq Query.
Полная документация DateTime
источник
Вы также можете использовать DateTime.TryParseExact (), как показано ниже, если вы не уверены во входном значении.
источник
Поместите этот код в статический класс
> public static class ClassName{ }
Таким образом, вы можете использовать
источник
Я просто нашел элегантный способ:
источник
Разные культуры мира пишут строки дат по-разному. Например, в США 20.01.2008 - 20 января 2008 года. Во Франции это вызовет исключение InvalidFormatException. Это потому, что Франция читает дату-время как День / Месяц / Год, а в США - Месяц / День / Год.
Следовательно, строка, подобная 20.01.2008, будет проанализирована до 20 января 2008 года во Франции, а затем вызовет исключение InvalidFormatException в США.
Чтобы определить текущие настройки культуры, вы можете использовать System.Globalization.CultureInfo.CurrentCulture.
источник
этот дает тебе
источник
Хочешь быстро?
Допустим, у вас есть дата в формате yyMMdd.
Самый быстрый способ, который я нашел, это:
Просто выберите индексы в соответствии с выбранным форматом даты. Если вам нужна скорость, возможно, вы не против «неуниверсального» способа работы.
Этот метод занимает около 10% времени, необходимого для:
источник